答案:std::unique用于去除容器中连续重复元素,需先排序并配合erase使用。

在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} 等,取决于排序和原始顺序。
std::unique 要求迭代器是双向迭代器,因此适用于:
注意:std::list 和 std::forward_list 提供了成员函数 list::unique(),可以直接使用,且支持自定义比较。
std::list<int> lst = {1, 2, 2, 3, 3, 3}; lst.sort(); // list 需要先排序 lst.unique(); // 直接去重使用 unique 时容易犯的错误:
std::unique 的时间复杂度是 O(n),前提是元素已排序。比较次数为 n-1 次。
基本上就这些。掌握 sort + unique + erase 这个组合,就能高效实现 STL 容器的去重。以上就是C++如何在STL中实现容器去重unique方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号