c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】

技术百科 穿越時空 发布时间:2026-01-01 浏览:
std::unique不会真正删除元素,仅将相邻重复项移至末尾并返回新逻辑尾迭代器;必须配合erase才能完成真实去重,且要求容器先排序以确保相同元素相邻。

直接说结论:std::unique 本身**不会真正删除元素**,它只把重复项“挤到末尾”,并返回一个新末尾迭代器;必须配合容器的 erase 成员函数才能完成真实删除。很多人卡在这一步,以为调用完 std::unique 就去重完了。

为什么 std::unique 要求容器已排序?

std::unique 只移除「相邻重复项」,不关心全局是否重复。比如 {1,2,1}std::unique 后仍是 {1,2,1} —— 因为两个 1 不相邻。

  • 它内部逻辑是:从第二个元素起,逐个与前一个比较,相等就跳过(标记为待移除)
  • 所以必须先用 std::sort 排序,让相同值聚在一起
  • std::list 可用其成员函数 unique()(自动处理指针),但普通序列容器如 std::vector 必须手动配对 sort + unique + erase

vector 去重的标准三步写法

这是最常出错的地方:漏掉 erase,或用错迭代器范围。

  • std::sort(v.begin(), v.end()) —— 先排序(默认升序)
  • auto new_end = std::unique(v.begin(), v.end()) —— 返回去重后逻辑结尾(指向第一个冗余元素)
  • v.erase(new_end, v.end()) —— 真实擦除冗余部分
std::vector v = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
std::sort(v.begin(), v.end());                    // → {1,1,2,3,3,4,5,5,6,9}
auto it = std::unique(v.begin(), v.end());        // → it 指向第2个1之后的位置(即索引2)
v.erase(it, v.end());                             // → {1,2,3,4,5,6,9}

自定义类型去重要注意什么?

如果容器存的是自定义结构体,std::unique 默认用 operator== 比较,但前提是它得能访问到这个函数;同时 std::sort 需要 operator 或传入比较函数。

  • 确保 operator== 正确定义(非 const 或参数类型不匹配会导致编译失败)
  • 若用 lambda 或函数对象做 sort 比较,unique 仍只认 ==,两者语义必须一致,否则结果不可预测
  • 性能上:std::unique 是 O(n) 时间,但前面的 sort 是 O(n log n),整体瓶颈在排序

最容易被忽略的是:当容器含浮点数或自定义精度比较时,== 判等可能失效;这时候不能直接用 std::unique,得自己写循环 + epsilon 比较 + 手动移动元素。


# 的是  # 这是  # 很多人  # 第一个  # 移除  # 第二个  # 自定义  # 迭代  # auto  # 循环  # 对象  # c++  # 指针  # 为什么  # 仍是  # operator  # 成员函数  # 结构体  # Lambda  # const  # sort  # 升序 


相关栏目: <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 AI推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 SEO优化<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 技术百科<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 谷歌推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 百度推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 网络营销<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 案例网站<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 精选文章<?muma echo $count; ?>

相关推荐

在线咨询

点击这里给我发消息QQ客服

在线咨询

免费通话

24h咨询:4006964355


如您有问题,可以咨询我们的24H咨询电话!

免费通话

微信扫一扫

微信联系
返回顶部