remove 移除(但不删除)
移除[fist,last)之中所有与value相等的元素。这一算法并不真正从容器中删除那些元素(换句话说容器大小并未改变),而是将每一个不与value相等(也就是不打算移除)的元素轮番赋给first之后的空间。如果要删除那些残余数据,可将返回的迭代器交给所在容器的erase() member function。
remove_copy():
移除[first,last)区间内所有与value相等的元素。它并不真正从容器中删除那些元素(换句话说,原容器没有任何改变),而是将结果复制到一个以result标示起始位置的容器身上。
新容器可以和原容器重叠,但如果对新容器实际给值时,超越了旧容器的大小,会产生无法预期的结果。返回值OutputIterator指出被复制的最后元素的下一位置。
注意:array不适合使用remove()和remove_if(),因为array无法缩小尺寸,导致残余数据永远存在。对array而言,较受欢迎的算法是remove_copy()和remove_copy_if()。
STL源码:
template
ForwardIterator remove(ForwardIterator first,ForwardIterator last, const T& value)
{
first=find(first,last,value);
ForwardIterator next=first;
return first==last?first:remove_copy(++next,last,first,value);
}
remove_copy
template
OutputIterator remove_copy(InputIterator first,InputIterator last,OutputIterator result,const T& value)
{
for(;first!=last;++first)
{
*result=*first;
++result;
}
return *result;
}
代码示例:
//测试remove
#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int data[]={-2,0,-3,1,1,0,-2,1,1,10};
//测试vector---在移除过程中每一步的结果
cout<<"coll: "< coll(data,data+10);
vector::iterator pos;
//输出原序列元素
copy(coll.begin(),coll.end(),ostream_iterator(cout," "));
cout<(cout," "));
cout<(cout," "));
cout<(cout," "));
cout< coll1(data,data+10);
//deque coll1(data,data+10);
//list coll1(data,data+10);
//原序列
copy(coll1.begin(),coll1.end(),ostream_iterator(cout," "));
cout<(cout," "));
cout< coll2;
for(int i=0;i<(sizeof(data)/sizeof(data[0]));i++)
{
coll2.push_back(data[i]);
}
//原序列
copy(coll2.begin(),coll2.end(),ostream_iterator(cout," "));
cout<(cout," "));
cout<
remove_copy_if:
移除[first,last)区间内所有被仿函数pred评估为true的元素。它并不是真正从容器中删除那些元素(换句话说原容器没有任何改变),而是将结果复制到一个以result标示起始位置的容器身上。
新容器可以和原容器重叠,但如果针对新容器实际给值时,超越了旧容器的大小,会产生无法预期的结果。返回值OutputIterator指出被复制的最后元素的下一位置。
STL源码:
template
ForwardIterator remove_if(ForwardIterator first,ForwardIterator last,Predicate pred)
{
first=find_if(first,last,pred);
ForwardIterator next=first;
return first==last?first:remove_copy_if(++next,last,first,pred);
}
template
OutputIterator remove_copy_if(OutputIterator first,OutputIterator last,OutputIterator result,Predicate pred)
{
for(;first!=last;++first)
{
if(!pred(*first))
{
*result=*first;
++result;
}
}
return result;
}