转自http://www.cnblogs.com/heyonggang/archive/2013/08/07/3243477.html

类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素

该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值范围得结束。

 1 // sort words alphabetically so we can find the duplicates
2 sort(words.begin(), words.end());
3 /* eliminate duplicate words:
4 * unique reorders words so that each word appears once in the
5 * front portion of words and returns an iterator one past the
6 unique range;
7 * erase uses a vector operation to remove the nonunique elements
8 */
9 vector<string>::iterator end_unique = unique(words.begin(), words.end());
10 words.erase(end_unique, words.end());
在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。

若调用sort后,vector的对象的元素按次序排列如下:

sort  jumps  over quick  red  red  slow  the  the turtle

则调用unique后,vector中存储的内容是:

注意,words的大小并没有改变,依然保存着10个元素;只是这些元素的顺序改 变了。调用unique“删除”了相邻的重复值。给“删除”加上引号是因为unique实际上并没有删除任何元素,而是将无重复的元素复制到序列的前段, 从而覆盖相邻的重复元素。unique返回的迭代器指向超出无重复的元素范围末端的下一个位置。

获得不重复元素个数 : int c = unique(words.begin(), words.end())-words.begin();

注意:算法不直接修改容器的大小。如果需要添加或删除元素,则必须使用容器操作。

example:

 1 #include <iostream>
2 #include <cassert>
3 #include <algorithm>
4 #include <vector>
5 #include <string>
6 #include <iterator>
7 using namespace std;
8
9 int main()
10 {
11 //cout<<"Illustrating the generic unique algorithm."<<endl;
12 const int N=11;
13 int array1[N]={1,2,0,3,3,0,7,7,7,0,8};
14 vector<int> vector1;
15 for (int i=0;i<N;++i)
16 vector1.push_back(array1[i]);
17
18 vector<int>::iterator new_end;
19 new_end=unique(vector1.begin(),vector1.end()); //"删除"相邻的重复元素
20 assert(vector1.size()==N);
21
22 vector1.erase(new_end,vector1.end()); //删除(真正的删除)重复的元素
23 copy(vector1.begin(),vector1.end(),ostream_iterator<int>(cout," "));
24 cout<<endl;
25
26 return 0;
27 }

运行结果为:

aaarticlea/png;base64,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" alt="" />

最新文章

  1. MongoDB学习笔记
  2. SQL Server 2008 R2 企业版/开发版/标准版(中英文下载,带序列号)
  3. MySQL中的两种临时表
  4. /dev/random 和 /dev/urandom的一点备忘
  5. 【bzoj3160】万径人踪灭
  6. Write operations are not allowed in read-only mode错误
  7. qt QLabel 显示网络图片
  8. AAPT: libpng error: Not a PNG file 问题解决
  9. [转帖]vivado &amp; VS2013工具
  10. SQL Server on Ubuntu——Ubuntu上的SQL Server(全截图)
  11. sql语句性能优化
  12. T-SQL:qualify和window 使用(十七)
  13. [TensorBoard] Train and Test accuracy simultaneous tracking
  14. POJ 1182 食物链 (拆点并查集)
  15. Java设计模式应用——适配器模式
  16. Hadoop HA on Yarn——集群配置
  17. CPP strcat函数使用
  18. 亿级PV请求的三种负载均衡技术
  19. npm下载缓慢解决方法
  20. nyoj905 卡片游戏

热门文章

  1. eclipse配置tomcat加大内存的方法
  2. Codeforces Round #355 (Div. 2)
  3. 50道经典的JAVA编程题 (6-10)
  4. 【转】 bash简介及通配符、扩展通配符 shopt -s extglob
  5. MapReduce计算模型
  6. python basic programs
  7. 应用web框架模块设计三国演义篇--转至微博
  8. 宿舍局域网与Internet连接
  9. maven创建web项目
  10. 搭建Discuz! (mysql+apache+Discuz! )