讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中如何使用std::unique去除vector重复元素_c++容器去重步骤【汇总】

风杰大大_7596

风杰大大_7596

发布时间:2026-01-21 15:57:52

|

773人浏览过

|

来源于php中文网

原创

std::unique仅移除相邻重复元素,使用前必须先排序;若需去重且保持原序,应配合unordered_set遍历;对自定义类型须重载operator==及operator<(如用sort)。

c++中如何使用std::unique去除vector重复元素_c++容器去重步骤【汇总】

std::unique 不能直接去重,必须先排序

std::unique 不是“去重函数”,它只移除相邻重复元素。如果 vector 未排序,std::unique 会漏掉非相邻的重复项。比如 {1,2,1}std::unique 后仍是 {1,2,1} —— 因为两个 1 不相邻。

正确做法是:先用 std::sort 排序,再用 std::unique + erase 组合:

std::vector<int> 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}
auto last = std::unique(v.begin(), v.end());            // 返回新逻辑尾迭代器
v.erase(last, v.end());                                 // 真正删除重复元素

注意:std::unique 不改变容器大小,只把重复元素“挤到末尾”,并返回指向新逻辑结尾的迭代器。

用 std::set 或 std::unordered_set 做无序去重

如果不需要保持原始顺序,且元素可比较(set)或可哈希(unordered_set),直接构造集合最简洁:

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

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载
std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6, 5};
std::set<int> s(v.begin(), v.end());
std::vector<int> unique_v(s.begin(), s.end()); // 自动升序

若需保留首次出现顺序(如 {3,1,4,1,5}{3,1,4,5}),用 std::unordered_set 辅助遍历:

std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6, 5};
std::unordered_set<int> seen;
std::vector<int> unique_v;
for (int x : v) {
    if (seen.insert(x).second) {  // insert 返回 pair<iter, bool>,second 为 true 表示新插入
        unique_v.push_back(x);
    }
}

std::unique 对自定义类型要重载 operator==

std::unique 默认用 operator== 判断相等。对结构体或类,必须显式定义该运算符,否则编译失败或行为未定义:

struct Point {
    int x, y;
    bool operator==(const Point& other) const {
        return x == other.x && y == other.y;
    }
};

同时,若配合 std::sort 使用,还需提供 operator< 或自定义比较器,否则 sort 无法比较。

常见错误:只重载 == 却忘了 <,导致 sort 编译不过;或者重载了但没加 const 和引用,引发临时对象绑定问题。

性能与语义差异:别为了“看起来短”选错方案

  • sort + unique + erase:时间复杂度 O(n log n),空间 O(1)(原地),适合大数组且允许重排
  • unordered_set 遍历去重:时间 O(n),空间 O(n),保留顺序,但哈希开销和内存占用略高
  • std::set 构造:时间 O(n log n),空间 O(n),结果有序但丢失原序,且比 sort+unique 慢(因每次插入都做树平衡)

最容易被忽略的一点:所有基于 std::unique 的方案都依赖“相邻性”,而相邻性由你控制——要么靠 sort,要么靠预处理(比如按某字段分组后单独去重)。没意识到这点,就容易在调试时花几小时找“为什么还剩重复”。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5704

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2324

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1592

2025.10.17

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

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

1098

2023.09.04

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

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

1898

2023.09.20

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

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

3894

2025.06.09

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

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

4071

2025.07.04

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

0

2026.09.22

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

0

2026.09.22

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn