remove
●接受的是前向迭代器,返回的也是前向迭代器。
●移除但不删除。这个操作意思是原来那个位置的元素值改变了,但是该存储单元还是存在的。容器的大小不会发生变化。
●可能会有残余数据。可以利用erase()成员函数删除残余数据。
●代码实现:
template <typename ForwardIterator,typename T>
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函数来实现数据的移动
remove_copy
●接收的是输入迭代器和输出迭代器,返回的也是输出迭代器
●原来的容器的数据和大小没有发生任何改变,把原来容器的数据复制到新容器内。
●新容器可以和原容器重叠,但是如果对新容器实际给值时,超越了原容器的大小时,会产生无法预期的结果。
●返回值指出被复制的最后一个元素的下一个位置。
●代码的实现:
template <typename InputIterator,typename OutputIterator,typename T>
OutputIterator remove_copy(InputIterator first,InputIterator last,OutputIterator result,const T& value)
{
for(;first!=last;++first)
{
if(*first!=value)
{
*result=*first;
++result;
}
}
return result;
}
remove_if
●移除给定范围内所有被函数对象判定为真的元素。
●并不是真正移除那些元素,只是改变那些符合条件的元素的值而已。容器的大小没有发生改变。
●可能会有残留的数据存在。可以使用erase成员函数删除那些残留元素。
●返回值指出整理后的最后元素的下一个位置。
●代码实现:
template <typename ForwardIterator,typename Predicate>
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);
}
remove_copy_if
●接受输入、输出迭代器和函数对象,返回输出迭代器对象
●将输入范围内被函数对象判定为真的那些函数复制到新容器中,原始容器的数据和大小没有发生改变。
●新容器可以和原容器重叠,但是如果对新容器实际给值时,超越了原容器的大小时,会产生无法预期的结果。
●返回值指出被复制的最后一个元素的下一个位置。
●代码实现:
template <typename InputIterator,typename OutputIterator,typename Predicate>
OutputIterator remove_copy_if(InputIterator first,InputIterator last,OutputIterator result,Predicate pred)
{
for(;first!=last;++first)
{
if(!pred(*first))
{
*result=*first;
++result;
}
}
return result;
}