std::unique仅移除相邻重复元素并返回新逻辑结尾迭代器,不改变容器大小,需配合erase才能真正删除;使用前必须确保元素已排序或相同元素相邻。
unique 函数本身不会真正删除重复元素
std::unique 只是把重复元素“挤到末尾”,并返回一个指向新逻辑结尾的迭代器,原容器 size 不变。它不负责擦除,也不保证容器变短——这是最常被误解的一点。
常见错误现象:vec = {1,1,2,2,3} 调用 std::unique(vec.begin(), vec.end()) 后,vec 可能变成 {1,2,3,2,3}(后两个值未定义但保留),size() 还是 5。
- 必须配合
erase使用才能真正删掉重复项:vec.erase(std::unique(vec.begin(), vec.end()), vec.end()) -
unique要求输入已排序(或至少相同元素连续),否则只对相邻重复有效 - 它比较的是「相邻」元素,不是全局去重;未排序时
{1,2,1}经unique后仍是{1,2,1}
必须先 sort 再 unique 才能实现完整去重
对 std::vector 做全局去重,sort + unique + erase 是标准三连操作。其中 sort 让相同元素相邻,为 unique 创造前提。
示例: