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