需要的头文件:
algorithm
源码:
//remove
template <class _ForwardIter, class _Tp>
_ForwardIter remove(_ForwardIter __first, _ForwardIter __last,
const _Tp& __value) {
__first = find(__first, __last, __value);
_ForwardIter __i = __first;
return __first == __last ? __first
: remove_copy(++__i, __last, __first, __value);
}
//remove_copy
template <class _InputIter, class _OutputIter, class _Tp>
_OutputIter remove_copy(_InputIter __first, _InputIter __last,
_OutputIter __result, const _Tp& __value) {
for ( ; __first != __last; ++__first)
if (!(*__first == __value)) {
*__result = *__first;
++__result;
}
return __result;
}
//remove_if
template <class _ForwardIter, class _Predicate>
_ForwardIter remove_if(_ForwardIter __first, _ForwardIter __last,
_Predicate __pred) {
__first = find_if(__first, __last, __pred);
_ForwardIter __i = __first;
return __first == __last ? __first
: remove_copy_if(++__i, __last, __first, __pred);
}
//remove_copy_if
template <class _InputIter, class _OutputIter, class _Predicate>
_OutputIter remove_copy_if(_InputIter __first, _InputIter __last,
_OutputIter __result, _Predicate __pred) {
for ( ; __first != __last; ++__first)
if (!__pred(*__first)) {
*__result = *__first;
++__result;
}
return __result;
}
作用:
remove
移除[first,last)之中所有与value相等的元素。然而并不是真正的从容器中删除那些元素,而是将每一个不与value相等的元素轮番赋值给first之后的空间。
remove_copy
移除[first,last)之中所有与value相等的元素。然而并不是真正的从容器中删除那些元素,而是将结果复制到一个以result标示起始位置的容器身上。
remove_if
移除[first,last)区间内所有仿函数pred核定为true的元素。它并不是真正从容器中删除那些元素(参考remove)。每一个不符合pred条件的元素都会被轮番赋值给first之后的空间。
remove_copy_if
移除[first,last)区间内所有仿函数pred核定为true的元素。它并不是真正从容器中删除那些元素,而是将结果复制到一个以result标示起始位置的容器身上。新容器可以和原容器重叠,但如果针对新容器实际给值时,超越了新容器的大小,会发生无法预期的结果。
例子:
//例子只给出使用方法,有很多细节不予阐述
//具体细节参见 《STL源码剖析》
#include <algorithm>
#include <vector>
#include <iostream>
#include <functional>
using namespace std;
template <typename T>
void display(const T& x)
{
cout << x << " ";
}
int main()
{
///////////////////////////////remove///////////////////////////////////////////
{
int ia[] = { 0,1,2,3,4,5,6,6,6,7,8 };
vector<int> iv(begin(ia), end(ia));
//移除(但不删除)元素6,尾端可能有残余数据(可以erase函数除去)
remove(iv.begin(), iv.end(), 6);
for_each(iv.begin(), iv.end(), display<int>); cout << endl;
//0 1 2 3 4 5 7 8 6 7 8
}
///////////////////////////////remove_copy///////////////////////////////////////////
{
int ia[] = { 0,1,2,3,4,5,6,6,6,7,8 };
vector<int> iv(begin(ia), end(ia));
//移除(但不删除)元素6,结果置于另一个区间
vector<int> iv2(12);
remove_copy(iv.begin(), iv.end(), iv2.begin(), 6);
for_each(iv2.begin(), iv2.end(), display<int>); cout << endl;
//0 1 2 3 4 5 7 8 (0 0 0 0)
}
///////////////////////////////remove_if///////////////////////////////////////////
{
int ia[] = { 0,1,2,3,4,5,6,6,6,7,8 };
vector<int> iv(begin(ia), end(ia));
//移除(但不删除)小于6的元素,尾端可能有残余数据
remove_if(iv.begin(), iv.end(), bind2nd(less<int>(), 6));
for_each(iv.begin(), iv.end(), display<int>); cout << endl;
//6 6 6 7 8 5 6 6 6 7 8
}
///////////////////////////////remove_copy_if///////////////////////////////////////////
{
int ia[] = { 0,1,2,3,4,5,6,6,6,7,8 };
vector<int> iv(begin(ia), end(ia));
//移除(但不删除)小于7的元素,结果置于另一个区间
vector<int> iv2(12);
remove_copy_if(iv.begin(), iv.end(), iv2.begin(), bind2nd(less<int>(), 7));
for_each(iv2.begin(), iv2.end(), display<int>); cout << endl;
//7 8 0 0 0 0 0 0 0 0 0 0
}
return 0;
}
注意:
- remove中调用remove_copy,remove_if中调用了remove_copy_if,请理清它们之间为什么可以这么做。