0

0

C++中unique函数怎么去重_C++配合sort实现向量去重方法【总结】

尼克

尼克

发布时间:2026-02-05 13:09:35

|

417人浏览过

|

来源于php中文网

原创

std::unique仅移除相邻重复元素并返回新逻辑结尾迭代器,不改变容器大小,需配合erase才能真正删除;使用前必须确保元素已排序或相同元素相邻。

c++中unique函数怎么去重_c++配合sort实现向量去重方法【总结】

unique 函数本身不会真正删除重复元素

std::unique 只是把重复元素“挤到末尾”,并返回一个指向新逻辑结尾的迭代器,原容器 size 不变。它不负责擦除,也不保证容器变短——这是最常被误解的一点。

常见错误现象:vec = {1,1,2,2,3} 调用 std::unique(vec.begin(), vec.end()) 后,vec 可能变成 {1,2,3,2,3}(后两个值未定义但保留),size() 还是 5。

  • 必须配合 erase 使用才能真正删掉重复项: vec.erase(std::unique(vec.begin(), vec.end()), vec.end())
  • unique 要求输入已排序(或至少相同元素连续),否则只对相邻重复有效
  • 它比较的是「相邻」元素,不是全局去重;未排序时 {1,2,1}unique 后仍是 {1,2,1}

必须先 sort 再 unique 才能实现完整去重

std::vector 做全局去重,sort + unique + erase 是标准三连操作。其中 sort 让相同元素相邻,为 unique 创造前提。

示例:

超能文献
超能文献

超能文献是一款革命性的AI驱动医学文献搜索引擎。

下载

立即学习C++免费学习笔记(深入)”;

std::vector v = {3,1,4,1,5,9,2,6,5};
std::sort(v.begin(), v.end()); // → {1,1,2,3,4,5,5,6,9}
v.erase(std::unique(v.begin(), v.end()), v.end()); // → {1,2,3,4,5,6,9}
  • 时间复杂度:sort 是 O(n log n),unique 是 O(n),整体主导项是排序
  • 如果原始数据已有部分有序,或允许不稳定顺序,可考虑 std::unordered_set 辅助去重(但会丢失顺序且需额外空间)
  • 自定义类型需提供可比较的 operator(供 sort)和相等判断(供 unique,默认用 ==

unique 对非基本类型要小心相等语义

std::unique 默认用 operator== 判断是否重复,如果你的类没重载 ==,或者重载得不严谨(比如忽略某些成员),就会漏去重或误去重。

  • 结构体/类去重前,确认 == 行为符合业务意义上的“重复”
  • 也可传入自定义谓词: std::unique(v.begin(), v.end(), [](const auto& a, const auto& b) { return a.id == b.id; })
  • 注意:谓词参数是相邻两个元素,必须满足等价关系(自反、对称、传递),否则行为未定义

替代方案:用 set 或 unordered_set 一次性去重

如果不需要保留原始顺序,或想避免修改原容器,直接构造 std::setstd::unordered_set 更直观:

std::vector v = {3,1,4,1,5};
std::set s(v.begin(), v.end()); // 自动排序 + 去重
std::vector result(s.begin(), s.end()); // → {1,3,4,5}
  • std::set:O(n log n),结果有序,适合后续还需二分查找的场景
  • std::unordered_set:平均 O(n),无序,内存开销略大,但速度通常更快
  • 两者都不改变原 vector,也无需手动 erase,但无法控制去重“保留哪个”(总是保留第一个插入的)
真正容易被忽略的是:哪怕你写了 sort + unique + erase,如果容器里存的是指针或智能指针,unique 比较的是地址或 get() 值,而不是它们指向的对象内容——这时候就得自己写谓词,而且得确保对象本身的相等逻辑是可靠的。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

396

2023.09.04

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

535

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

282

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

193

2025.07.04

Python 数据库优化与性能调优
Python 数据库优化与性能调优

本专题专注讲解 Python 在数据库性能优化中的应用,包括数据库连接池管理、SQL 查询优化、索引设计与使用、数据库事务管理、分布式数据库与缓存系统的结合。通过分析常见性能瓶颈,帮助开发者掌握 如何优化数据库操作,提升 Python 项目在数据库层的响应速度与处理能力。

0

2026.02.05

Java 微服务与 Spring Cloud 实战
Java 微服务与 Spring Cloud 实战

本专题讲解 Java 微服务架构的开发与实践,重点使用 Spring Cloud 实现服务注册与发现、负载均衡、熔断与限流、分布式配置管理、API Gateway 和消息队列。通过实际项目案例,帮助开发者理解 如何将传统单体应用拆分为高可用、可扩展的微服务架构,并有效管理和调度分布式系统中的各个组件。

0

2026.02.05

C++ 多线程编程与线程池设计
C++ 多线程编程与线程池设计

本专题深入讲解 C++ 中的多线程编程与线程池设计,涵盖 C++11/14/17 的线程库、线程同步机制(mutex、condition_variable、atomic)、线程池设计模式、任务调度与优化、并发瓶颈分析与解决方案。通过多个实际案例,帮助开发者掌握 如何设计高效的线程池管理系统,提升 C++ 程序在高并发场景下的性能与稳定性。

0

2026.02.05

微信网页版文件传输助手教程合集
微信网页版文件传输助手教程合集

本专题整合了微信网页版文件传输助手教程、入口等等内容,阅读专题下面的文章了解更多详细内容。

15

2026.02.04

微信文件过期恢复教程
微信文件过期恢复教程

本专题整合了微信文件过期恢复方法、技巧教程,阅读专题下面的文章了解更多详细内容。

10

2026.02.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8.6万人学习

C 教程
C 教程

共75课时 | 4.5万人学习

C++教程
C++教程

共115课时 | 15.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号