STL中的unique和unique_copy函数

简介: 一、unique函数 这个函数的功能就是删除相邻的重复元素,然后重新排列输入范围内的元素,并返回一个最后一个无重复值的迭代器(并不改变容器长度)。 例如: 1 vectorq(10); 2 for(int i = 0; i < 10; i++){ 3 ...

一、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没有返回值,不能直接得出有几个不重复元素。

目录
相关文章
|
3月前
|
算法 安全 C++
【C++14算法】make_unique
【C++14算法】make_unique
|
C# 数据库
Lua Table转C# Dictionary
Lua Table转C# Dictionary
89 0
|
索引
开发指南—Sequence—隐式用法—CREATE TABLE
在为拆分表或广播表的主键定义AUTO_INCREMENT后,Sequence可以用于自动填充主键,由PolarDB-X自动维护。 扩展标准建表语法,增加了自增列的Sequence类型,如果未指定类型关键字,则默认类型为GROUP。PolarDB-X自动创建的、跟表相关联的Sequence名称,都是以AUTO_SEQ_为前缀,后面加上表名。
|
C++ 容器
STL—set(一)
set意为集合,是一个内部自动有序,并且不含重复元素的容器,有些题目可能会要求去重操作,这时候就可以用set去解决,并且set可以实现自动排序,熟练的使用set之后可以减少某些题目的思维量,如果要使用set,需要添加头文件#include <set>
84 0
|
机器学习/深度学习 C++
STL—set(二)
s.find(value);返回set中对应值为value的迭代器,时间复杂度是O(logN),N为set内的元素个数
90 0
|
存储 程序员 编译器
std::unique_ptr 删除器的秘密
### TL;DR - 使用无状态的函数对象作为 std::unique_ptr 的删除器不会占用额外的内存空间;而使用函数指针或有状态的函数对象则会增加 std::unique_ptr 对象的大小,其中 std::function 的内存开销最大,应尽量避免使用。 - MSVC 使用 compressed pair 来存储 std::unique_ptr 的原始指针和删除器,利用 Empty
953 0
1041 Be Unique (20)
#include #include #include #include #include using namespace std; int main() { int n; cin >> n; ...
744 0
|
C++ 关系型数据库 Oracle
|
C++
C++:为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是?
为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是? template <class T, class D = default_delete<T>> class unique_ptr { public: .
1405 0