unique_copy用法

[cpp]  view plain copy
  1. /* template <class InputIterator, class OutputIterator> 
  2.   OutputIterator unique_copy ( InputIterator first, InputIterator last, 
  3.                                OutputIterator result ); 
  4.  
  5. template <class InputIterator, class OutputIterator, class BinaryPredicate> 
  6.   OutputIterator unique_copy ( InputIterator first, InputIterator last, 
  7.                                OutputIterator result, BinaryPredicate pred );//pred参数对函数的使用无任何影响*/  
  8. // unique_copy example  
  9. #include <iostream>  
  10. #include <algorithm>  
  11. #include <vector>  
  12. using namespace std;  
  13.   
  14. bool myfunction (int i, int j) {  
  15.   return (i==j);  
  16. }  
  17.   
  18. int main () {  
  19.   int myints[] = {10,20,20,20,30,30,20,20,10};  
  20.   vector<int> myvector (9);                            // 0  0  0  0  0  0  0  0  0  
  21.   vector<int>::iterator it;  
  22.   
  23.   // using default comparison:  
  24.   it=unique_copy (myints,myints+9,myvector.begin());   // 10 20 30 20 10 0  0  0  0  
  25.                                                        //                ^  
  26.   
  27.   sort (myvector.begin(),it);                          // 10 10 20 20 30 0  0  0  0  
  28.                                                        //                ^  
  29.   
  30.   // using predicate comparison:  
  31.   it=unique_copy (myvector.begin(), it, myvector.begin(), myfunction);  
  32.                                                        // 10 20 30 20 30 0  0  0  0  
  33.                                                        //          ^  
  34.   
  35.   myvector.resize( it - myvector.begin() );            // 10 20 30  
  36.   
  37.   // print out content:  
  38.   cout << "myvector contains:";  
  39.   for (it=myvector.begin(); it!=myvector.end(); ++it)  
  40.     cout << " " << *it;  
  41.   
  42.   cout << endl;  
  43.   
  44.   return 0;  
  45. }  


unique_copy根据字面意思就是去除重复元素在执行copy运算。

int ia[] = { 0, 1, 1, 2, 3, 5, 5, 8 };
vector< int > ivec( ia, ia+8 ), vres;
// 执行下面操作程序异常终止

unique_copy( ivec.begin(), ivec.end(), vres.begin() );

因为vres 没有被分配空间,

unique_copy()算法的两个版本一个赋位元素而另一个插入元素,上面用到的就是前者,所以可以先声明大小。

int ia[] = { 0, 1, 1, 2, 3, 5, 5, 8 };
vector< int > ivec( ia, ia+8 ), vres(8);
// 执行下面操作程序异常终止

unique_copy( ivec.begin(), ivec.end(), vres.begin() );

但是copy的元素明显少于原来的大小,这样输出后为用“0”来填补后续空间,所以用插入元素的方式最好,这就用到插入迭代器了。

插入迭代器提供三个适配器函数,返回类型为insert_iterator类型

(1)back_inserter() 它使用容器的push_back()插入操作

unique_copy( ivec.begin(), ivec.end(),back_inserter( vres );//现在用 vres.push_back() 插入

(2)front_inserter() 它使用容器的push_front()插入操作

但是注意vector 类不支持push_front()次vector 上的操作是错误
unique_copy( ivec.begin(), ivec.end(),
front_inserter( vres );


(3)inserter() 它调用容器的insert()插入操作代替赋值操作符inserter()要求两个实参
容器本身以及它的一个iterator 指示起始插入的位置例如
unique_copy( ivec.begin(), ivec.end(),
inserter( vres, vres.begin() );

然后用如下测试代码

int _tmain(int argc, _TCHAR* argv[])
{
int ia[] = { 0, 1, 1, 2, 3, 5, 5, 8 };
vector< int > ivec( ia, ia+8 ), vres;
vector< int >::iterator ite_int;
// 导致未定义的运行时刻行为
ite_int = unique_copy( ivec.begin(), ivec.end(), back_inserter(vres) );
for(vector <int>::iterator iter = vres.begin(); iter!=ite_int; ++iter)
cout <<*iter <<' ';   

}

上面程序运行后除了点问题 看了MSDN上给的unique_copy返回值后恍然大悟

An output iterator addressing the position one past the final element in the destination range that is receiving the copy with consecutive duplicates removed.

它返回的并不是原先类型的迭代器,而是后来copy的目的容器迭代器,而back_inserter()返回的目的迭代器是back_insert_iterator<int>类型的 和接收类型vector< int >::iterator ite_int不匹配故出错。

所以将后面几句做如下修改 运行成功

unique_copy( ivec.begin(), ivec.end(), back_inserter(vres) );
for(vector <int>::iterator iter = vres.begin(); iter!=vres.end(); ++iter)
cout <<*iter <<' ';

[cpp]  view plain copy
  1. #include <iostream>   
  2. #include <vector>   
  3. #include <algorithm>   
  4. #include <iterator>   
  5. using namespace std;   
  6.   
  7. int main(int argc, char* argv[])  
  8. {  
  9.     vector<int> ivec;   
  10.   
  11.     ivec.push_back(1);  
  12.     ivec.push_back(3);  
  13.     ivec.push_back(5);  
  14.     ivec.push_back(2);  
  15.     ivec.push_back(4);  
  16.     ivec.push_back(3);  
  17.     ivec.push_back(6);  
  18.   
  19.     /* 
  20.  
  21.     //copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(ivec));  
  22.     sort(ivec.begin(),ivec.end()); 
  23.      
  24.     vector<int>::iterator iter = unique(ivec.begin(), ivec.end());  
  25.  
  26.     ivec.erase(iter,ivec.end());  
  27.  
  28.     copy(ivec.begin(),ivec.end(),ostream_iterator<int>(cout," "));  
  29.  
  30.     system("pause");  
  31.  
  32.     */  
  33.   
  34.     //  
  35.     vector<int> bvec;  
  36.   
  37.     sort(ivec.begin(), ivec.end());  
  38.   
  39.     vector<int>::iterator iter = ivec.begin();  
  40.   
  41.     for( ; iter != ivec.end(); ++ iter) {  
  42.         printf("%d  ", *iter);  
  43.     }  
  44.   
  45.     printf("\n");  
  46.   
  47.     unique_copy(ivec.begin(), ivec.end(), back_inserter(bvec));  
  48.   
  49.     iter = bvec.begin();  
  50.   
  51.     for( ; iter != bvec.end(); ++ iter) {  
  52.         printf("%d  ", *iter);  
  53.     }  
  54.   
  55.     return 0;  
  56. }  

详细出处参考: http://www.itqun.net/content-detail/118248.html

你可能感兴趣的:(unique_copy用法)