商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > C++ std::adjacent_find用法 _ 查找容器内连续重复元素【实战】

C++ std::adjacent_find用法 _ 查找容器内连续重复元素【实战】

  发布于2026-07-18 阅读(0)

扫一扫,手机访问

C++标准库里的std::adjacent_find,用起来简单,踩坑的地方却不少。很多开发者遇到“查不到重复元素”的问题,第一反应是怀疑容器数据有问题,其实多半是底层逻辑没写对。

std::adjacent_find 查不到重复元素?检查比较逻辑是否默认或自定义错

默认情况下,std::adjacent_find只检查相邻两个元素是否相等——内部调用的是operator==。如果你的类型不支持这个操作符,或者你想自定义比较逻辑,那就得自己传一个谓词。但问题往往出在这里:谓词的语义是“返回true表示这两个元素满足条件”,而不是“返回true表示它们不同”。常见的错误是把谓词写成a > b,却期望它找到重复值。这实际上是在找“递减对”,而不是“相等对”。

  • 不传谓词时,类型必须支持operator==,否则编译报错
  • 传谓词时,正确的写法是[](const auto& a, const auto& b) { return a == b; },而不是别的
  • std::vector这类类型,大小写敏感比较需要显式传std::equal_to(),或者自己写一个忽略大小写的lambda

C++ std::adjacent_find用法 _ 查找容器内连续重复元素【实战】

返回迭代器失效的典型场景:容器被修改后继续解引用

迭代器失效是C++里一个老生常谈的问题,在std::adjacent_find上同样常见。这个函数返回的是正向迭代器,一旦容器发生插入、删除、reserveresize,这个迭代器就立即失效。最典型的坑是:查到位置后,把它存为裸指针或长期缓存,然后容器被修改了,再用这个迭代器——结果不言而喻。

  • 安全做法:查完立刻使用。比如if (auto it = std::adjacent_find(v.begin(), v.end()); it != v.end()) { /* 处理 *it 和 *(it+1) */ }
  • 千万别写auto pos = std::adjacent_find(...); v.push_back(x); use(*pos);——此时pos已经无效,解引用是未定义行为
  • 如果确实需要记录位置并延后处理,改用下标索引(it - v.begin()),前提是容器不会重新分配内存

在 list 和 forward_list 上性能差异大吗?

从算法本身看,std::adjacent_find是线性遍历,与容器底层无关。但实际性能受迭代器类型影响:std::list的双向迭代器支持++--,没问题;std::forward_list的前向迭代器只能++,而adjacent_find内部只需要单向移动,所以完全兼容,没有额外开销。

  • 所有标准序列容器(vectordequelistforward_list)和关联容器(set等)都可用,只要提供符合要求的迭代器
  • std::array和原始数组也支持,传入arrarr + N即可
  • forward_list,不能用it + 1,但std::adjacent_find内部用的是std::next(it),已经适配好了

找不到时返回 end(),但容易误判空容器

另一个常见误区:当容器元素数少于2时,std::adjacent_find直接返回end(),不报错,也不抛异常。新手往往忽略这个前提,直接对返回值做*(it + 1),导致越界。

  • 正确判断方式只有一种:if (it != container.end())。别用it == container.begin()it == nullptr,这些都不对
  • 对空容器或单元素容器,调用本身是合法的,结果确定为end()
  • 如果逻辑上要求至少两个元素才搜索,建议前置检查:if (v.size() < 2) { /* 直接返回或处理 */ }

真正复杂的地方在于,谓词语义和迭代器生命周期是耦合的——一旦出错,就是静默的未定义行为,不会报错,也不会给你任何提示。最容易被忽略的是:哪怕你只读容器,只要用了std::vector::emplace_back这类可能触发重新分配的操作,之前拿到的迭代器就废了。这些细节,往往比算法本身更需要留意。

本文转载于:https://www.php.cn/faq/2345267.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注