贝利信息

c++ vector去重方法_c++ unique函数使用详解

日期:2026-01-06 00:00 / 作者:穿越時空
std::unique不能直接给vector去重,因为它只移除相邻重复元素并返回新逻辑尾迭代器;若vector未排序或重复元素不相邻,则无效,必须先排序或改用unordered_set配合remove_if保序去重。

为什么 std::unique 不能直接给 vector 去重?

std::unique 并不是真正删除重复元素,它只把**相邻重复元素压缩成一个**,并返回新逻辑结尾的迭代器。如果 vector 未排序或重复元素不相邻,unique 完全无效。

标准去重三步写法(保留原顺序)

若需去除所有重复项且保持首次出现的顺序(如 {1,3,2,3,1}{1,3,2}),unique 不适用,得换思路:

std::vector v = {1, 3, 2, 3, 1};
std::unordered_set seen;
auto new_end = std::remove_if(v.begin(), v.end(), [&seen](int x) {
if (seen.count(x)) return true;
seen.insert(x);
return false;
});
v.erase(new_end, v.end());

unique + sort 实现去重(不保序)

这是最常被文档示例采用的方式,适合允许结果排序的场景:

std::vector v = {"apple", "banana", "apple", "cherry"};
std::sort(v.begin(), v.end());
auto it = std::unique(v.begin(), v.end());
v.erase(it, v.end()); // 得到 {"apple", "banana", "cherry"}

自定义类型去重时 unique 的陷阱

若用 unique 处理结构体或类,必须确保相等判断逻辑与 operator== 或传入的二元谓词一致;否则行为未定义:

真正去重前,先问自己:要保序吗?数据是否已排好?重复是相邻还是分散?选错方法比写错代码更难调试。