移除元素(remove,remove_if...unique...)
remove
因为本算法作用的是iterator,所以并不会改变Container大小,会返回一个新的iterator new_last,是的first到new_last中的元素都不等于value,左端元素的相对位置不变
template <class ForwardIterator,class T> ForwardIterator remove(ForwardIterator first,ForwardIterator last,const T& value);
remove_if
移除pred(*i)为true的元素
template <class ForwardIterator,class Predicate> ForwardIterator remove_if(ForwardIterator first,ForwardIterator last,Predicate pred);
remove_copy
不会复制值与value相等元素,返回值是result的尾端,被复制的元素的相对位置不改变
template <class ForwardIterator,class OutputIterator,class T> ForwardIterator remove_copy(ForwardIterator first,ForwardIterator last,OutputIterator result,const T& value);
remove_copy_if
template <class ForwardIterator,class OutputIterator,class Predicate> ForwardIterator remove_copy_if(ForwardIterator first,ForwardIterator last,OutputIterator result,Predicate pred);
unique
元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。并不是真的删除,而是指重复元素的位置被不重复的元素给占领。把不重复的元素移到前面来,未被移除的元素的相对位置不改变。
返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。
//版本一:重载operator==,如果*i==*(i-1)则有重复的元素 template <class ForwardIterator> ForwardIterator unique(ForwardIterator fisrt,ForwardIterator last); //版本二:自定义函数对象cmp(*i,*(i-1))为true,有重复 template <class ForwardIterator,class BinaryPredicate> ForwardIterator unique(ForwardIterator fisrt,ForwardIterator last,BinaryPredicate cmp);
unique_copy
//版本一:重载operator==,如果*i==*(i-1)则有重复的元素 template <class InputIterator,class OutputIterator> OutputIterator unique_copy(ForwardIterator fisrt,ForwardIterator last,OutputIterator result); //版本二:自定义函数对象cmp(*i,*(i-1))为true,有重复 template <class ForwardIterator,class OutputIterator,class BinaryPredicate> OutputIterator unique_copy(ForwardIterator fisrt,ForwardIterator last,OutputIterator result,BinaryPredicate cmp);
#include <iostream> #include <vector> #include <algorithm> #include <string.h> #include <iterator> using namespace std; class F { public: bool operator()(int i) { return i&1==1; } }; class F1 { public: F1(string t):s1(t){} bool operator()(string s) { return !strcmp(s.c_str(),s1.c_str()); } private: string s1; }; int main() { vector<int> v{1,2,3,4,5,6}; //auto it=remove_if(v.begin(),v.end(),F()); //cout<<*--it<<endl; //v.erase(remove_if(v.begin(),v.end(),F()),v.end()); vector<string> vs{"hello"," ","word!","how"," ","you","."}; remove_copy_if(vs.begin(),vs.end(),ostream_iterator<string>(cout," "),F1("you")); /*for(auto i:vs) cout<<i<<' '; cout<<endl;*/ return 0; }
#include <iostream> #include <vector> #include <algorithm> using namespace std; class F { public: F(vector<int> t):_v(t){} bool operator()(int i,int j) { if(count(_v.begin(),_v.end(),i)!=1) return true; else return false; } private: vector<int> _v; }; int main() { //用sort,unique函数去除相邻重复的元素 vector<int> arr{1,2,3,4,5,6,5,6}; sort(arr.begin(),arr.end(),greater<int>()); arr.erase(unique(arr.begin(),arr.end()),arr.end());//unique返回new_last,其中不包含重复的元素 for_each(arr.begin(),arr.end(),[](int i) { cout<<i<<' '; }); cout<<endl; vector<int> arr1{1,2,3,4,4,5,6,5,6}; arr1.erase(unique(arr1.begin(),arr1.end(),F(arr1)),arr1.end()); for_each(begin(arr1),end(arr1),[](int i) { cout<<i<<' '; }); cout<<endl; return 0; }