移除性算法
本系列所有算法根据元素值或某一准则,在一个区间内移除某些元素。这些算法并不能改变元素的数量,它们只是以逻辑上的思考,将原本置于后面的“不移除元素”向前移动,覆盖那些被移除元素而已,它们都返回新区间的逻辑终点(也就是最后一个“不移除元素”的下一位置)。
移除某些特定元素
remove(beg,end,cosntt T& value)
remove_if(beg,end,op)
(1)remove()会移除区间{beg,end)中每一个“与value相等”的元素;
(2)remove_if()会移除区间[beg,end)中每一个“令以下一元判断式:op(elem)获得true”的元素;
(3)两个算法都返回变动后的序列的新逻辑终点(也就是最后一个未被移除元素的下一个位置);
(4)这些算法都是把原本置于后的的未移除元素向前移动,覆盖被移除元素;
(5)未被移除的元素在相对次序上保持不变;
(6)调用者在调用此算法之后,应保证从此采用返回的新逻辑终点,而不再使用原始终点end;
(7)op不应该在函数调用过程中改变自身状态;
(8)由于会发生元素变动,所以这些算法不可用于关联式容器,关联式容器提供了功能相似的成员函数erase();
(9)list提供了一个等效成员函数remove():不是重新赋值元素,而是重新安排指针,因此具有更加性能;
(10)复杂性:线性;
代码示例:
#include"fuzhu.h" using namespace std; int main() { vector<int> coll; INSERT_ELEMENTS(coll,2,6); INSERT_ELEMENTS(coll,4,9); INSERT_ELEMENTS(coll,1,7); vector<int>::iterator pos; pos=remove(coll.begin(),coll.end(),5); PRINT_ELEMENTS(coll,"size not change: \n");//vector中一共有3个5,所以后三位是已经不需要的 cout<<"remove :"<<endl; copy(coll.begin(),pos,ostream_iterator<int>(cout," ")); cout<<endl; coll.erase(pos,coll.end());//删除了最后三位 PRINT_ELEMENTS(coll,"size change: \n"); coll.erase(remove_if(coll.begin(),coll.end(),bind2nd(less<int>(),4)),coll.end());//移动并删除 PRINT_ELEMENTS(coll,"<4 elements: \n"); system("pause"); return 0; }