C++中vector去重有五种方法:一、sort+unique(顺序不保留);二、unique仅去相邻重复(顺序保留);三、set+遍历(顺序保留);四、unordered_set+遍历(顺序保留、性能优);五、stable_partition+erase(标记后删除)。

如果您需要从C++的std::vector中移除重复元素,但又不改变原始顺序或仅需相邻重复去重,则不能仅依赖单一算法。以下是几种不同场景下的具体操作步骤:
一、使用std::unique配合std::sort实现整体去重(顺序不保留)
该方法先将vector排序,使相同元素相邻,再用std::unique将重复项移动至末尾,最后调用erase删除冗余部分。此方式适用于允许重排元素顺序的场景。
1、包含必要头文件:#include
2、声明并初始化vector,例如:std::vector
立即学习“C++免费学习笔记(深入)”;
3、调用std::sort对vector升序排序:std::sort(v.begin(), v.end());。
4、调用std::unique获取去重后的新逻辑尾端迭代器:auto new_end = std::unique(v.begin(), v.end());。
5、使用erase删除[new_end, v.end())区间内所有元素:v.erase(new_end, v.end());。
二、使用std::unique仅去除相邻重复元素(顺序严格保留)
std::unique本身只移除连续重复项,不会改变非相邻重复元素的位置。因此若原vector已按某种规则排好序或本身具有局部重复结构,可直接使用该特性。
1、确保vector中重复元素处于相邻位置,例如:std::vector
2、调用std::unique并接收返回的迭代器:auto it = std::unique(c.begin(), c.end());。
3、执行erase清除尾部冗余:c.erase(it, c.end());。
三、借助std::set保持插入顺序去重(顺序保留,无排序)
利用std::set自动去重且可配合遍历判断是否已存在,结合额外容器存储首次出现的元素,从而在不排序前提下完成去重。
1、声明辅助集合与结果vector:std::set
2、遍历原vector,对每个元素x执行判断:if (seen.insert(x).second) result.push_back(x);。
3、将result赋值回原vector或直接使用:v = result;。
四、使用std::unordered_set实现O(1)平均查找去重(顺序保留,性能更优)
相较于std::set,std::unordered_set提供平均常数时间复杂度的插入与查找,适合大数据量且无需排序的去重需求。
1、引入头文件:#include
2、定义辅助哈希集合与目标vector:std::unordered_set
3、逐个检查并添加未出现过的元素:for (int x : v) { if (visited.find(x) == visited.end()) { unique_v.push_back(x); visited.insert(x); } }。
4、更新原vector内容:v = unique_v;。
五、使用std::stable_partition模拟去重逻辑(仅标记,不真正删除)
当需保留所有元素但将重复项“隔离”到尾部时,可借助自定义谓词与stable_partition,配合后续erase实现条件性清理。
1、定义一个记录已见元素的unordered_set:std::unordered_set
2、使用lambda捕获该集合,作为partition谓词:auto pred = [&occurred](int x) { return occurred.insert(x).second; };。
3、调用std::stable_partition按谓词重排vector:auto partition_point = std::stable_partition(v.begin(), v.end(), pred);。
4、擦除从partition_point开始的所有元素:v.erase(partition_point, v.end());。


















