std::mismatch是中的函数模板,返回首个不相等位置的迭代器对std::pair;若完全匹配则返回各自末尾迭代器,需确保范围合法并检查返回值有效性。
std::mismatch 是 C++ 标准库中定义在 头文件里的函数模板,用于**并行比较两个序列,找出首个不相等的位置对**。它不返回布尔值,而是返回一个 std::pair,其中 first 指向第一个序列中差异位置,second 指向第二个序列中对应位置。如果整个较短序列都匹配,则返回各自末尾迭代器。
最常见场景是逐元素比对两个容器(如 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())
当需要忽略大小写、浮点容差、或结构体字段比对时,传入第 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 才触发 mismatchstd::lexicog
raphical_compare 混淆bool(decltype(*it1), decltype(*it2))
三个高频出错点:
b.end() 当作第二序列终点,却没确认 b 是否足够长 → 触发未定义行为it_a == a.end(),此时解引用会崩溃;务必先检查 it_a != a.end()
std::list::iterator 和 std::vector::iterator 不能直接配对;std::mismatch 要求两个迭代器类型可比较(通常要求同 category 或可隐式转换)真正麻烦的地方不在语法,而在于你得自己决定“比较多长”——std::mismatch 不自动截断,它信任你传进来的范围合法。这点和 std::equal 一样,容易被忽略。