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

目录
相关文章
|
7月前
|
前端开发 测试技术 API
DeepSeek-V3小版本升级,非推理模型王者归来
今天,DeepSeek低调地在魔搭社区开源 DeepSeek-V3-0324 模型,虽然官方低调称之为小版本升级,但能力提升一点也不小。
267 5
|
存储 监控 Java
分布式链路监控系统问题之使用Byte Buddy进行字节码增强时的问题如何解决
分布式链路监控系统问题之使用Byte Buddy进行字节码增强时的问题如何解决
158 0
|
9月前
|
人工智能 运维 Serverless
Qwen2.5 的云端新体验,5 分钟完成极速部署
将 Qwen2.5 模型部署于函数计算 FC,用户能依据业务需求调整资源配置,有效应对高并发场景,并通过优化资源配置,如调整实例规格、多 GPU 部署和模型量化来提升推理速度。此外,函数计算支持多样化 GPU 计费模式(按需计费、阶梯定价、极速模式),可根据业务需求调整,在面对高频请求和大规模数据处理时,能够显著降低综合成本。
501 16
|
数据可视化 数据挖掘 Python
Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化(下)
Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、可视化
|
存储 Java 索引
Java LinkedList详解
`LinkedList`是Java集合框架中的一个重要类,实现了`List`、`Deque`和`Cloneable`接口。它基于双向链表,支持动态扩展,允许重复元素。虽然通过索引访问元素的时间复杂度为O(n),但在插入和删除操作上表现优异,时间复杂度为O(1)。常用操作包括创建、添加、获取、删除和查找元素,以及使用迭代器遍历。适用于频繁插入和删除的场景,如队列和栈的实现。
420 7
|
8月前
|
人工智能 大数据 云计算
Salesforce联手阿里云,销售易联手腾讯,还在靠”卖血求生“的CRM独立玩家何去何从?
销售易与腾讯战略合作升级,李强任董事长,史彦泽继续担任CEO。此次合作将推动行业竞争进入新维度,中国企服市场迎来深层变革。通过腾讯的技术支持,销售易将为客户提供更优质的服务和智能化体验。与此同时,依赖融资扩张的某F CRM厂商需思考如何将资本转化为实际竞争力。随着资本市场态度转变,生态协同成为关键,中国CRM市场正经历历史性分化,企业需重新审视战略定位,以技术融合创造增量价值,满足客户业务增长需求。
|
Android开发
Android自定义View之正方形
【6月更文挑战第23天】
148 0
|
12月前
|
数据安全/隐私保护 Python
【10月更文挑战第17天】「Mac上学Python 28」基础篇9 - 条件语句与逻辑判断
在Python中,条件语句和逻辑判断是控制程序执行流程的关键工具,帮助程序在不同条件下做出不同决策。通过本篇的学习,您将掌握单选、双分支、多选结构、单行条件表达式、条件嵌套、条件判断的类型和逻辑运算符的用法,从而更灵活地控制程序执行流程。
217 5
|
存储 KVM 虚拟化
VMware 安装华三CAS云平台过程
H3C CAS是一款基于KVM和OpenStack的虚拟化管理平台,包括CVK(虚拟化内核)、CVM(虚拟化管理)、CIC(云业务管理)和SSV(自助服务虚拟化)四个组件。实验目的是在VMware上搭建CAS云平台,通过创建虚拟机、选择Ubuntu 64位操作系统、配置处理器和内存、挂载ISO镜像等步骤进行安装。安装完成后,通过IP:8080/cas或https://ip:8443/cas以admin/admin登录验证。
1280 1
|
网络协议
公网官网建站笔记(五):域名工信部备案完整流程并解析公网访问
上一篇域名从阿某云转入了腾某云,可以开始备案了,本篇将以我司为例开始讲解域名备案流程,给技术型的小公司提供参考。备案这个有点长,本篇主要描述了管局备案流程。
公网官网建站笔记(五):域名工信部备案完整流程并解析公网访问

热门文章

最新文章