# C++ STL算法系列4---unique , unique_copy函数

一.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());```

`sort  jumps  over quick  red  red  slow  the  the turtle`

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 }```

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

``` 1 //使用unique_copy算法
2 //将一个list对象中不重复的元素赋值到一个空的vector对象中
3 #include<iostream>
4 #include<list>
5 #include<vector>
6 #include<algorithm>
7 using namespace std;
8
9 int main()
10 {
11     int ia[7] = {5 , 2 , 2 , 2 , 100 , 5 , 2};
12     list<int> ilst(ia , ia + 7);
13     vector<int> ivec;
14
15     //将list对象ilst中不重复的元素复制到空的vector对象ivec中
16     //sort(ilst.begin() , ilst.end());  //不能用此种排序，会报错
17     ilst.sort();  //在进行复制之前要先排序，切记
18     unique_copy(ilst.begin() , ilst.end() , back_inserter(ivec));
19
20     //输出vector容器
21     cout<<"vector: "<<endl;
22     for(vector<int>::iterator iter = ivec.begin() ; iter != ivec.end() ; ++iter)
23         cout<<*iter<<" ";
24     cout<<endl;
25
26     return 0;
27 }```

假如

```list<int> ilst(ia , ia + 7);

`sort(ilst.begin() , ilst.end());`

这里要注意list和vector的排序用什么方法。

`《Effective STL》里这些话可能有用处：item 31　　　　“我们总结一下你的排序选择：　　 ● 如果你需要在vector、string、deque或数组上进行完全排序，你可以使用sort或stable_sort。　　 ● 如果你有一个vector、string、deque或数组，你只需要排序前n个元素，应该用partial_sort。　　 ● 如果你有一个vector、string、deque或数组，你需要鉴别出第n个元素或你需要鉴别出最前的n个元素，而不用知道它们的顺序，nth_element是你应该注意和调用的。　　 ● 如果你需要把标准序列容器的元素或数组分隔为满足和不满足某个标准，你大概就要找partition或stable_partition。　　 ● 如果你的数据是在list中，你可以直接使用partition和stable_partition，你可以使用list的sort来代替sort和stable_sort。如果你需要partial_sort或nth_element提供的效果，你就必须间接完成这个任务，但正如我在上面勾画的，会有很多选择。　　　　另外，你可以通过把数据放在标准关联容器中的方法以保持在任何时候东西都有序。你也可能会考虑标准非STL容器priority_queue，它也可以总是保持它的元素有序。`

289 篇文章43 人订阅

0 条评论

## 相关文章

### 分分钟使用正则表达式 原

从概念上来说，正则表达式也是一门小巧而精炼的语言，它可以用来简化检索特定的字符串，替换特定字符等功能，有许多开发语言工具，都内嵌支持正则表达式。...

8630

201100

9620

12330

36560

22320

### c++13.0 STL[stack,queue,set,dequeue]

set相关知识点: ---- set:集合,红黑树实现 特点: 1.0 内部的元素根据其值自动排序。 2.0 内部元素只能出现一次。 set数据结...

25060

34760

### Shell 数组

Shell中数据类型不多，比如说字符串，数字类型，数组。数组是其中比较重要的一种，同时Shell中的数组不像JAVA/C，只能是一维数组，没有二维数组;数组元素...

21800

22490