C++中std::unique_copy怎么去重连续元素_C++标准库算法操作方法【笔记】-C++

std::unique_copy仅去除相邻重复元素且不修改原容器;需源区间已排序或接受仅去重连续块语义,目标区间须预分配空间并用返回迭代器截断。

std::unique_copy 只能去除相邻重复元素,不能全局去重;它不修改原容器,而是把去重结果复制到目标区间

std::unique_copy 的作用范围和前提条件

这个函数只识别并跳过「紧挨着的重复项」,比如 {1,2,2,3,3,3,4} 会变成 {1,2,3,4},但 {1,2,3,2,4} 中的第二个 2 不会被删——因为它前面是 3,不连续。

  • 输入迭代器必须支持前向遍历(至少是 ForwardIterator)
  • 源区间必须已按某种规则排好序,或你明确接受“仅去重连续块”的语义
  • 目标容器/区间要有足够空间容纳输出(返回值是目标末尾迭代器,务必用它来截断)

正确调用 std::unique_copy 的三要素

常见错误是忽略返回值、没预留空间、或误以为它会自动 shrink 目标容器。实际需手动处理长度:

std::vector src = {1,1,2,2,2,3,4,4};
std::vector dst(src.size()); // 预分配,避免 reallocate 影响迭代器有效性
auto last = std::unique_copy(src.begin(), src.end(), dst.begin());
dst.erase(last, dst.end()); // 关键:用返回的迭代器清理多余元素
  • 第三个参数是目标起始位置,不是容器本身
  • 返回值是「写入结束位置」,类型与第三个参数相同(这里是 dst.begin() 类型)
  • 如果目标是 raw array 或 std::array,不能调 erase,得自己记下长度

配合自定义比较逻辑的注意事项

默认用 operator==,但可通过第四个参数传入二元谓词。注意:该谓词仍只比较相邻元素,且必须满足等价关系(自反、对称、传递),否则行为未定义:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++中std::unique_copy怎么去重连续元素_C++标准库算法操作方法【笔记】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4006363+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4006363+
  • 本周更新: 0+
  • 最后更新: 2026-03-16