0

0

c++中如何使用unique函数_c++ vector去重常用操作方法【详解】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-31 14:23:28

|

511人浏览过

|

来源于php中文网

原创

std::unique仅重排相邻重复元素并返回新逻辑结尾,不真正删除;必须配合erase才能缩容,且要求输入已排序或相同元素相邻。

c++中如何使用unique函数_c++ vector去重常用操作方法【详解】

unique 函数本身不真正删除元素,只重排

std::unique 不是“去重函数”,它只把相邻重复元素移到容器末尾,并返回一个迭代器指向新逻辑结尾。原 vector 大小不变,内存里仍存着旧值。

常见错误是只调用 std::unique 就以为完成去重:

std::vector<int> v = {1, 2, 2, 3, 3, 3, 4};
std::unique(v.begin(), v.end()); // ❌ 没用!v.size() 还是 7

必须配合 erase 才能真正删掉冗余:

std::vector<int> v = {1, 2, 2, 3, 3, 3, 4};
auto new_end = std::unique(v.begin(), v.end());
v.erase(new_end, v.end()); // ✅ 此时 v = {1, 2, 3, 4}
  • std::unique 要求输入已排序(或至少相同元素相邻),否则只去“连续重复”
  • 它比较的是 *it*(it-1),不是和首元素比
  • vector<string> 或自定义类型,需确保 operator== 可用,或传入二元谓词

去重前必须 sort,否则结果不可靠

如果原始 vector 是乱序的,比如 {3, 1, 2, 1, 3},直接 unique 得到的是 {3, 1, 2, 1, 3}(因为没相邻重复),根本没效果。

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

正确流程是先 sortunique + erase

一点PPT
一点PPT

一句话生成专业PPT,AI自动排版配图

下载
std::vector<int> v = {3, 1, 2, 1, 3};
std::sort(v.begin(), v.end());                    // → {1, 1, 2, 3, 3}
auto it = std::unique(v.begin(), v.end());       // → {1, 2, 3, 3, 3}
v.erase(it, v.end());                             // → {1, 2, 3}
  • std::sort 默认升序;如需保持原顺序去重,不能用 unique,得换哈希法
  • 对含浮点数的 vector,慎用 == 判断相等,unique 可能因精度失效
  • sort + unique 时间复杂度 O(n log n),空间 O(1),适合内存敏感但允许重排的场景

保持原顺序去重:用 unordered_set 记录已见元素

当必须保留首次出现顺序(如 {3, 1, 2, 1, 3}{3, 1, 2}),sort + unique 不适用,得边遍历边过滤。

典型做法是用 std::unordered_set 缓存已出现的值,只保留第一次遇到的:

std::vector<int> v = {3, 1, 2, 1, 3};
std::unordered_set<int> seen;
std::vector<int> result;

for (int x : v) {
    if (seen.find(x) == seen.end()) {
        seen.insert(x);
        result.push_back(x);
    }
}
// result = {3, 1, 2}
  • 此法时间复杂度平均 O(n),空间 O(n),适用于中等规模数据
  • 注意 unordered_set 对自定义类型需提供 hashoperator==
  • 如果只是“判断是否存在”,别用 count()find() 更快(避免二次查找)
  • 想原地修改?可以反向遍历 + erase,但多次 erase 在中间位置性能差,不推荐

unique_copy 避免修改原 vector,但需预分配空间

如果不想动原 vector,又不想手写循环,std::unique_copy 是更干净的选择 —— 它把去重后结果拷到另一容器。

但注意:目标容器必须有足够空间,或用插入迭代器:

std::vector<int> src = {1, 1, 2, 2, 3, 3};
std::vector<int> dst;

// 方法1:用 back_inserter(推荐,自动扩容)
std::unique_copy(src.begin(), src.end(), std::back_inserter(dst));

// 方法2:预分配大小(需先 sort)
std::sort(src.begin(), src.end());
dst.resize(src.size());
auto end_it = std::unique_copy(src.begin(), src.end(), dst.begin());
dst.erase(end_it, dst.end());
  • unique_copy 同样要求输入已排序(或相邻重复)才能正确去重
  • back_inserter 最安全,但每次 push_back 可能触发多次内存重分配
  • 若确定最大可能大小,预分配 + resize + erase 更高效
真正去重从来不是调一个函数就完事。关键是分清:要不要保序、数据量多大、能不能排序、是否允许额外空间——选错方法,轻则结果错,重则性能崩。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1091

2023.08.02

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

sort排序函数用法
sort排序函数用法

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

410

2023.09.04

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

5

2026.03.18

Java Spring Security权限控制与认证机制实战
Java Spring Security权限控制与认证机制实战

本专题围绕 Java 后端安全体系建设展开,重点讲解 Spring Security 在权限控制与认证机制中的应用实践。内容涵盖用户认证流程、权限模型设计、JWT 鉴权方案、OAuth2 集成以及接口安全防护策略。通过实际项目案例,帮助开发者构建安全可靠的后端认证体系,提升系统安全性与可扩展能力。

21

2026.03.18

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

137

2026.03.17

多环境下的 Nginx 安装、结构与运维实战
多环境下的 Nginx 安装、结构与运维实战

本专题聚焦多环境下Nginx实战,详解开发、测试及生产环境的差异化安装策略与目录结构规划。深入剖析配置模块化设计、灰度发布流程及跨环境同步机制。结合监控告警、故障排查与自动化运维工具,提供全链路管理方案,助力团队构建灵活、高可用的Nginx服务体系,从容应对复杂业务场景挑战。

14

2026.03.17

PS 批量添加图片
PS 批量添加图片

本专题整合了PS批量添加图片教程合集,阅读专题下面的文章了解更多详细操作。

14

2026.03.17

Nginx 基础架构:从安装配置到系统化管理
Nginx 基础架构:从安装配置到系统化管理

本专题深入解析Nginx基础架构,涵盖从源码编译与包管理安装,到核心配置文件优化及虚拟主机部署。进一步探讨日志轮转、性能调优、高可用集群构建及自动化运维策略,助力管理员实现从单一服务搭建到企业级系统化管理的全面升级,确保Web服务高效、稳定运行。

7

2026.03.17

热门下载

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

精品课程

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

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.4万人学习

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

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