std::mismatch是中的函数模板,返回首个不相等位置的迭代器对std::pair;若完全匹配则返回各自末尾迭代器,需确保范围合法并检查返回值有效性。

std::mismatch 是什么,它返回什么
std::mismatch 是 C++ 标准库中定义在 头文件里的函数模板,用于**并行比较两个序列,找出首个不相等的位置对**。它不返回布尔值,而是返回一个 std::pair,其中 first 指向第一个序列中差异位置,second 指向第二个序列中对应位置。如果整个较短序列都匹配,则返回各自末尾迭代器。
基础用法:默认相等判断(operator==)
最常见场景是逐元素比对两个容器(如 std::vector、std::string),使用内置 ==:
std::vectora = {1, 2, 3, 4, 5}; std::vector b = {1, 2, 9, 4, 5}; auto [it_a, it_b] = std::mismatch(a.begin(), a.end(), b.begin()); // it_a 指向 a[2](值为 3),it_b 指向 b[2](值为 9)
- 必须确保第二个序列至少有第一个序列那么长,否则行为未定义(越界读)
- 实际中更安全的做法是传入两个序列的共同长度边界,或用
std::min(a.size(), b.size())截断 - 若想比较完整重叠部分,推荐显式传入
b.begin()和b.begin() + std::min(a.size(), b.size())
自定义比较:用 predicate 替代 operator==
当需要忽略大小写、浮点容差、或结构体字段比对时,传入第 4 个参数——二元谓词(返回 bool 的可调用对象):
std::string s1 = "Hello";
std::string s2 = "HELLO";
auto [it1, it2] = std::mismatch(s1.begin(), s1.end(), s2.begin(), s2.end(),
[](char a, char b) { return std::tolower(a) == std::tolower(b); });
- 谓词接收「第一个序列元素」和「第二个序列元素」,返回
true表示“视为相等”,false才触发 mismatch - 注意:谓词语义是“是否相等”,不是“是否小于”;别跟
std::lexicographical_compare混淆 - lambda、函数指针、functor 都可以,但需满足签名
bool(decltype(*it1), decltype(*it2))
常见误用与边界陷阱
三个高频出错点:
立即学习“C++免费学习笔记(深入)”;
- 传错迭代器范围:比如把
b.end()当作第二序列终点,却没确认b是否足够长 → 触发未定义行为 - 忽略返回值有效性:若两序列完全相同,
it_a == a.end(),此时解引用会崩溃;务必先检查it_a != a.end() - 混用不同容器类型时的类型推导问题:比如
std::list::iterator和std::vector::iterator不能直接配对;std::mismatch要求两个迭代器类型可比较(通常要求同 category 或可隐式转换)
真正麻烦的地方不在语法,而在于你得自己决定“比较多长”——std::mismatch 不自动截断,它信任你传进来的范围合法。这点和 std::equal 一样,容易被忽略。









