首页 > 后端开发 > C++ > 正文

C++如何在STL中实现容器去重unique方法

P粉602998670
发布: 2025-09-05 11:05:01
原创
691人浏览过
答案:std::unique用于去除容器中连续重复元素,需先排序并配合erase使用。

c++如何在stl中实现容器去重unique方法

在C++ STL中,unique 方法用于去除容器中连续重复的元素,但它并不会自动对整个容器排序或删除所有重复值。它只移除相邻的重复项,因此通常需要先排序才能实现“全局去重”。

基本用法与原理

std::unique 是定义在 <algorithm> 头文件中的函数模板,作用是将连续重复的元素“前移”,并返回一个迭代器,指向去重后有效元素的末尾。实际的容器大小不会改变,需要手动调用 erase 方法来真正删除多余元素。

常见用法如下:

// 示例:vector 去重 #include <vector> #include <algorithm> #include <iostream> std::vector<int> vec = {1, 2, 2, 3, 3, 3, 4}; // 1. 先排序,使相同元素相邻 std::sort(vec.begin(), vec.end()); // 2. 使用 unique 去除连续重复 auto it = std::unique(vec.begin(), vec.end()); // 3. 删除无效部分 vec.erase(it, vec.end()); // 输出结果:1 2 3 4 for (int x : vec) std::cout << x << " ";

自定义类型或条件去重

std::unique 支持传入自定义的比较函数,用于判断两个元素是否“相等”。比如,对字符串忽略大小写去重,或对结构体按某个字段判断。

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

// 示例:按绝对值去重 std::vector<int> nums = {-2, -1, 1, 2, 3}; std::sort(nums.begin(), nums.end(), [](int a, int b) { return std::abs(a) < std::abs(b); }); auto it = std::unique(nums.begin(), nums.end(), [](int a, int b) { return std::abs(a) == std::abs(b); }); nums.erase(it, nums.end());

此时结果可能为 {-1, 2, 3} 或 {1, -2, 3} 等,取决于排序和原始顺序。

人声去除
人声去除

用强大的AI算法将声音从音乐中分离出来

人声去除 23
查看详情 人声去除

适用于哪些容器?

std::unique 要求迭代器是双向迭代器,因此适用于:

  • std::vector
  • std::deque
  • std::array
  • std::list(但 list 更推荐使用成员函数 unique)

注意:std::list 和 std::forward_list 提供了成员函数 list::unique(),可以直接使用,且支持自定义比较。

std::list<int> lst = {1, 2, 2, 3, 3, 3}; lst.sort(); // list 需要先排序 lst.unique(); // 直接去重

注意事项

使用 unique 时容易犯的错误:

  • 忘记排序,导致非连续重复未被去除
  • 忘记调用 erase,容器大小未变,残留无效数据
  • 在未排序的序列中误以为能全局去重

std::unique 的时间复杂度是 O(n),前提是元素已排序。比较次数为 n-1 次。

基本上就这些。掌握 sort + unique + erase 这个组合,就能高效实现 STL 容器的去重。

以上就是C++如何在STL中实现容器去重unique方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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