从STL容器中删除元素对不同容器有不同的考虑,
使用不当可能会降低代码的效率,甚至产生无法预期的后果。
因为关联容器的erase成员返回值为void与其它STL容器返回值不同,
《Effictive STL》的Item9就总结了各种情形下的用法:
删除容器中等于某个值的所有元素时,
对连续存储的线性容器用erase成员套remove算法,
list有自己的remove成员可直接使用,
关联容器的erase成员可直接完成。
删除容器中满足某个谓词的所有元素时,
线性容器用erase成员套remove_if算法,
list的remove_if成员可以搞定,
关联容器可以用效率低下的remove_copy_if后接swap算法,
或手工循环并在调用erase成员时对迭代器使用后缀的++自增运算。
倘若在每删除一个元素时还要做点其它工作,
对线性容器可用手工循环,每次要用erase返回的迭代器位置更新,
对关联容器,需要同删除满足谓词的容器元素相同地后缀++的erase。
STL的某个实现版本的remove算法先调用find找到某个迭代器位置,
如果是序列末则返回该迭代器位置,
否则返回对该位置后面的子序列调用remove_copy算法,
给定的目标起始位置为find返回的迭代器位置。
同版本的remove_copy实现用for循环遍历输入的序列,
遍历每一步测试如序列元素值不与输入的值相等则把该元素赋值到目标迭代器位置,
同时目标迭代器位置前移,
最后返回目标迭代器位置。
remove_if和remove_copy_if的实现类似,
只是测试的条件用输入的谓词代替了等于运算符。
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment