首选 std::unordered_set 辅助去重以获得无重复副本,时间复杂度低且代码简洁;原地去重则用双指针法,O(n) 时间、O(1) 空间,需手动 resize。

用 std::set 或 std::unordered_set 辅助去重(适合原始数组不可变)
如果只是需要一份无重复的副本,且不关心原数组顺序是否保留,最稳妥的做法是借助标准容器自动去重。注意:std::set 会排序,std::unordered_set 保持插入顺序但需类型支持哈希。
- 对
int数组,std::unordered_set是首选:插入快、查重快、不改变逻辑顺序 - 若原数组很大,反复调用
insert()后再转回 vector,比手写双指针更易读、不易出错 - 不能直接用于 C 风格数组(如
int arr[10]),必须先知道长度,或改用std::vector
std::vector<int> nums = {1, 2, 2, 3, 3, 4};
std::unordered_set<int> seen;
std::vector<int> unique;
for (int x : nums) {
if (seen.insert(x).second) { // insert 返回 pair<iterator bool>,second 为 true 表示新插入
unique.push_back(x);
}
}</iterator></int></int></int>
原地去重:用双指针法处理 std::vector
这是最常用也最高效的原地去重方式,时间复杂度 O(n),空间 O(1),但要求元素可比较(如 ==),且只保留首次出现的元素。
- 适用于已排序数组时效果最佳;未排序时也能用,但结果顺序不变,重复项被“挤掉”,末尾留垃圾值
- 返回的是新逻辑长度,必须手动调用
resize()才真正缩短容器 - 别直接对裸数组(如
int arr[10])用双指针——没 size 信息,容易越界
std::unique
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











