c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】


std::unique不会真正删除元素,仅将相邻重复项移至末尾并返回新逻辑尾迭代器;必须配合erase才能完成真实去重,且要求容器先排序以确保相同元素相邻。

直接说结论:std::unique 本身**不会真正删除元素**,它只把重复项“挤到末尾”,并返回一个新末尾迭代器;必须配合容器的 erase 成员函数才能完成真实删除。很多人卡在这一步,以为调用完 std::unique 就去重完了。

为什么 std::unique 要求容器已排序?

std::unique 只移除「相邻重复项」,不关心全局是否重复。比如 {1,2,1}std::unique 后仍是 {1,2,1} —— 因为两个 1 不相邻。

  • 它内部逻辑是:从第二个元素起,逐个与前一个比较,相等就跳过(标记为待移除)
  • 所以必须先用 std::sort 排序,让相同值聚在一起
  • std::list 可用其成员函数 unique()(自动处理指针),但普通序列容器如 std::vector 必须手动配对 sort + unique + erase

vector 去重的标准三步写法

这是最常出错的地方:漏掉 erase,或用错迭代器范围。

  • std::sort(v.begin(), v.end()) —— 先排序(默认升序)
  • auto new_end = std::unique(v.begin(), v.end()) —— 返回去重后逻辑结尾(指向第一个冗余元素)
  • v.erase(new_end, v.end()) —— 真实擦除冗余部分
std::vector v = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
std::sort(v.begin(), v.end());                    // → {1,1,2,3,3,4,5,5,6,9}
auto it = std::unique(v.begin(), v.end());        // → it 指向第2个1之后的位置(即索引2)
v.erase(it, v.end());                             // → {1,2,3,4,5,6,9}

自定义类型去重要注意什么?

如果容器存的是自定义结构体,std::unique 默认用 operator== 比较,但前提是它得能访问到这个函数;同时 std::sort 需要 operator 或传入比较函数。

  • 确保 operator== 正确定义(非 const 或参数类型不匹配会导致编译失败)
  • 若用 lambda 或函数对象做 sort 比较,unique 仍只认 ==,两者语义必须一致,否则结果不可预测
  • 性能上:std::unique 是 O(n) 时间,但前面的 sort 是 O(n log n),整体瓶颈在排序

最容易被忽略的是:当容器含浮点数或自定义精度比较时,== 判等可能失效;这时候不能直接用 std::unique,得自己写循环 + epsilon 比较 + 手动移动元素。


# c++  # 为什么  # sort  # 成员函数  # const  # auto  # 结构体  # 循环  # Lambda  # 指针  # operator  # 对象  # 自定义  # 的是  # 迭代  # 移除  # 这是  # 升序  # 第一个  # 很多人  # 第二个  # 仍是 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: C++中引用和指针有什么区别?(代码说明)  微信JSAPI支付回调PHP怎么接收_处理JSAPI异步通知数据方法【指南】  手机php文件怎么变成mp4_安卓苹果打开php转mp4方法【教程】  如何在Golang中处理通道发送接收错误_防止阻塞或panic  为什么Go建议使用error接口作为错误返回_Go Error接口设计原因说明  Win11怎么更改输入法顺序_Win11调整语言首选位置【设置】  如何在Golang中使用内置函数_Golanglen append make等使用技巧  c++中如何使用虚函数实现多态_c++多态性实现原理  Python配置文件操作教程_JSONINIYAML解析与应用实战  php修改数据怎么批量改状态_批量更新status字段值技巧【操作】  Win11怎么设置快速访问主页_Windows11资源管理器文件夹选项  php怎么下载安装后设置错误日志_phpini log配置教程【汇总】  c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】  c++ nullptr与NULL区别_c++11空指针规范  c++的static关键字有什么用 静态变量和静态函数的应用场景【教程】  Win10怎样清理C盘爱奇艺缓存_Win10清理爱奇艺缓存步骤【步骤】  Drupal 中 HTML 链接被双重转义导致渲染异常的解决方案  Win11文件扩展名怎么显示 Win11查看文件后缀名设置【步骤】  如何使用Golang实现微服务状态监控_Golang服务运行状态采集方法  Mac如何设置动态壁纸?(让桌面动起来)  MAC如何设置网卡MAC地址克隆_MAC终端修改物理地址与环境模拟【教程】  VSC怎么在PHP中调试MySQL_数据库交互排查技巧【教程】  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  Win11怎么关闭SmartScreen_禁用Windows Defender筛选器教程【步骤】  Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】  Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数  Python解释执行模型_字节码流程说明【指导】  MAC怎么在照片中添加水印_MAC自带编辑工具文字水印叠加【方法】  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Win11怎么更改系统语言_Win11中文语言包下载与安装【指南】  php报错怎么查看_定位PHP致命错误与警告的方法【教程】  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何使用Golang优化模块引入路径_Golanggo mod tidy清理与优化方法  Windows10如何更改桌面图标间距_Win10注册表WindowMetrics修改  Win11任务栏怎么放到顶部_Win11修改任务栏位置方法【详细】  Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡时长设置【步骤】  如何高效获取循环末次生成的 NumPy 数组最后一个元素(无需额外循环)  PHP cURL GET请求:正确设置认证与自定义请求头的完整教程  Win11怎么自动隐藏任务栏_Win11全屏显示设置【美化】  如何使用Golang实现聊天室消息存档_存储聊天记录到文件  Golang如何实现基本的用户注册_Golang用户注册表单处理示例  Windows10系统怎么查看IP地址_Win10网络连接状态详细信息  本地php环境出现502错误_nginx或apache502badgateway解决技巧【解答】  Flask 表单数据通过 SMTP 发送邮件的完整实现教程  VSC怎样在Linux运行PHP_Ubuntu系统配置步骤【操作】  LINUX如何查看文件类型_Linux中file命令的识别与应用  如何在 Go 中正确反序列化 XML 多节点数组(解决仅解析首个元素的问题)  Python集合操作技巧_高效去重解析【教程】  php怎么捕获异常_trycatch结构处理运行时错误的技巧【方法】  如何使用Golang实现路由参数绑定_使用Mux和Request解析路径变量 

 2026-01-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.