• STL中的unique和unique_copy函数


    一、unique函数

    这个函数的功能就是删除相邻的重复元素,然后重新排列输入范围内的元素,并返回一个最后一个无重复值的迭代器(并不改变容器长度)。

    例如:

     1     vector<int>q(10);
     2     for(int i = 0; i < 10; i++){
     3         q[i] = (i*i + i*i*i) % 5;
     4         cout << q[i] << " ";
     5     }
     6     cout << endl;
     7     sort(q.begin(),q.end());
     8     
     9     for(int i = 0; i < 10; i++)
    10         cout << q[i] << " ";
    11     cout << endl;
    12     
    13     int tot = unique(q.begin(),q.end()) - q.begin();
    14     
    15     for(int i = 0; i < 10; i++)
    16         cout << q[i] << " ";
    17     
    18     cout << endl;
    19     cout << tot << endl;

    运行结果为

    unique返回的是迭代器,但我们减去容器首位置就可以得到无重复的长度了。还有就是使用unique函数前得排序(或者保证容器是有序的),因为它往相邻位置查找有无重复,unique函数完全等价于下面这个函数。

     1 iterator My_Unique (iterator first, iterator last){
     2   if (first==last) return last;
     3  
     4   iterator result = first;
     5   while (++first != last){
     6     if (!(*result == *first))  
     7       *(++result)=*first;
     8   }
     9   return ++result;
    10 }

    可以看的出unique的工作流程是吧不重复的元素往前移,并不是把重复元素往后移动,还有就是记得使用unique一定要保证有序!

    知道了unique函数就可以利用这个函数做很多事情了,比如和erase函数达到删除重复元素的目的等等。

    二、unique_copy

    功能和unique一样,但是多了一个copy,函数有三个参数,首位置、末位置和另一个容器,例如:

     1     vector<int>q(10),vec;
     2     for(int i = 0; i < 10; i++){
     3         q[i] = (i*i + i*i*i) % 5;
     4         cout << q[i] << " ";
     5     }
     6     cout << endl;
     7     sort(q.begin(),q.end());
     8 
     9     for(int i = 0; i < 10; i++)
    10         cout << q[i] << " ";
    11     cout << endl;
    12 
    13     unique_copy(q.begin(),q.end(),back_inserter(vec));
    14 
    15     for(int i = 0; i < 10; i++)
    16         cout << q[i] << " ";
    17     cout << endl;
    18 
    19     for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++){
    20         cout << *it << " ";
    21     }
    22     cout << endl;

    运行结果为

    可以发现,函数操作是拷贝到另一个容器中了,并不改变当前容器的元素顺序。

    值得一提的就是unique_copy没有返回值,不能直接得出有几个不重复元素。

  • 相关阅读:
    Window上编译最新版libCef(Branch 2704)(转载)
    在hue 使用oozie sqoop 从mysql 导入hive 失败
    hive 支持更新
    基于Hadoop生态圈的数据仓库实践 —— 环境搭建(三)笔记
    修改CENTOS7的网卡名(将网卡ens33修改为我们在centos6中常见的eth0)
    config network name
    Java服务部署规范(内部使用)
    MongoDB干货系列1-定期巡检之Mtools
    mongodb validation--像关系型数据库表去使用mongodb
    ntp 服务导致kudu集群不可用
  • 原文地址:https://www.cnblogs.com/xenny/p/9417914.html
Copyright © 2020-2023  润新知