You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传入std::mismatch的两个区间长度不同是否会触发未定义行为?

关于std::mismatch调用未定义行为的问题解答

你给出的三个参数版本std::mismatch调用确实属于未定义行为,相关说明如下:

  • 三个参数版本的std::mismatch在标准中明确规定了调用前置条件:第二个序列的长度必须至少和第一个序列相等,这个校验责任由调用方承担,标准实现不需要额外处理第二个序列越界的情况,你给出的示例代码违反了该前置条件,所以触发UB是符合预期的。
  • 你看到的三参数版本实现完全符合标准要求,不做第二个序列的末尾校验是为了避免不必要的性能开销,符合C++零开销抽象的设计原则。
  • 你提到的带第二个序列尾迭代器的四参数版本是C++14新增的重载,该版本没有序列长度的前置要求,会同时遍历到任意一个序列结束为止,是你场景下更安全的选择。
  • 你的示例代码改为四参数版本即可避免UB:
std::vector<int> v1{24, 10, 81, 7, 57};
std::vector<int> v2{24, 10, 81};
auto p = std::mismatch(v1.cbegin(), v1.cend(), v2.cbegin(), v2.cend());

该调用返回的pair中,first指向v1的第4个元素(值为7),second指向v2的尾后迭代器,行为完全确定。

内容的提问来源于stack exchange,提问作者Itachi Uchiwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:51:01