STL的移除性算法只是在逻辑上的删除,其实际上只是将符合条件的元素用后面的元素覆盖掉了。返回的位置是最后一个不符合条件的下一个位置。
移除性的算法主要有:
remove
remove_if
remove_copy
remove_copy_if
copy和没有copy的区别是copy的时候会移除与value 相等的元素
unique
unique_copy
其中unique和unique_copy都有自己的重载版本。重载版本主要是含有仿函数
相当于_if了,不知道为什么当时不是直接加_if 而是重载
unique的重载版本和普通版本的区别是:
比较方式有点不同,unique普通版本用来和前一个元素比较,如果是相等的,则取除;所以,若果要将序列式容器中所有相同的元素去除掉,必选先进行排序。要是一个有序的序列;
重载的版本中仿函数的比较是和前一个未删除的元素比较。
另外的一个注意点是stl的移除性算法会改变元素的位置,所以关联容器是不适应的
示例代码:
// stlsample.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <set>
using namespace std;
void print(const vector<int>& vec){
vector<int>::const_iterator iter = vec.begin();
for(; iter != vec.end(); ++iter){
cout << (*iter) <<",";
}
cout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec;
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
vec.push_back(6);
vec.push_back(7);
vec.push_back(8);
vec.push_back(9);
vec.push_back(5);
vec.push_back(6);
vec.push_back(5);
vec.push_back(4);
std::vector<int>::iterator iter;
//iter = remove(vec.begin(), vec.end(), 5);
//print(vec);
//vec.erase(iter, vec.end());
//print(vec);
//
//vec.erase(remove_if(vec.begin(), vec.end(), bind2nd(less<int>(), 4)), vec.end());
//print(vec);
//remove_copy remove_copy_if
remove_copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "), 3);
remove_copy_if(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "), bind2nd(less<int>(), 4));
multiset<int> mul_set;
remove_copy_if(vec.begin(), vec.end(), inserter(mul_set, mul_set.end()), bind2nd(greater<int>(), 4));
return 0;
}