std::mismatch
在头文件 <algorithm> 中定义 |
||
template< class InputIt1, class InputIt2 > std::pair<InputIt1, InputIt2> |
(1) | (从 C++20 开始为 constexpr) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > std::pair<ForwardIt1, ForwardIt2> |
(2) | (从 C++17 开始) |
template< class InputIt1, class InputIt2, class BinaryPred > std::pair<InputIt1, InputIt2> |
(3) | (从 C++20 开始为 constexpr) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPred > |
(4) | (从 C++17 开始) |
template< class InputIt1, class InputIt2 > std::pair<InputIt1, InputIt2> |
(5) | (从 C++14 开始) (从 C++20 开始为 constexpr) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > std::pair<ForwardIt1, ForwardIt2> |
(6) | (从 C++17 开始) |
template< class InputIt1, class InputIt2, class BinaryPred > std::pair<InputIt1, InputIt2> |
(7) | (从 C++14 开始) (从 C++20 开始为 constexpr) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPred > |
(8) | (从 C++17 开始) |
返回一对迭代器,指向来自 [
first1,
last1)
的第一个不匹配元素和一个从 first2 开始的范围
- 对于重载 (1-4),第二个范围具有 std::distance(first1, last1) 个元素。
- 对于重载 (5-8),第二个范围是
[
first2,
last2)
。
- 如果 std::distance(first1, last1) 和 std::distance(first2, last2) 不同,比较在 last1 或 last2 到达时停止。
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> 为 true 时才参与重载解析。 |
(直到 C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> 为 true。 |
(从 C++20 开始) |
内容 |
[编辑] 参数
first1, last1 | - | 元素的第一个范围 |
first2, last2 | - | 元素的第二个范围 |
policy | - | 要使用的执行策略。有关详细信息,请参见 执行策略。 |
p | - | 二元谓词,如果元素应被视为相等,则返回 true。 谓词函数的签名应等效于以下内容 bool pred(const Type1 &a, const Type2 &b); 虽然签名不需要具有 const &,但该函数不得修改传递给它的对象,并且必须能够接受类型(可能是常量) |
类型要求 | ||
-InputIt1 必须满足 LegacyInputIterator 的要求。 | ||
-InputIt2 必须满足 LegacyInputIterator 的要求。 | ||
-ForwardIt1 必须满足 LegacyForwardIterator 的要求。 | ||
-ForwardIt2 必须满足 LegacyForwardIterator 的要求。 | ||
-BinaryPred 必须满足 BinaryPredicate 的要求。 |
[编辑] 返回值
std::pair,包含指向第一个两个不相等元素的迭代器。
如果 last1 被到达,则对中的第二个迭代器是 std::distance(first1, last1)
th 迭代器,位于 first2 之后。
对于重载 (5-8),如果 last2 被到达,则对中的第一个迭代器是 std::distance(first2, last2)
th 迭代器,位于 first1 之后。
[编辑] 复杂度
给定 N
1 为 std::distance(first1, last1) 以及 N
2 为 std::distance(first2, last2)
1 次使用 operator== 的比较。
1 次应用谓词 p。
1,N
2) 次使用 operator== 的比较。
1,N
2) 次应用谓词 p。
[编辑] 异常
具有名为 ExecutionPolicy
的模板参数的重载报告错误如下
- 如果作为算法的一部分调用的函数的执行抛出异常,并且
ExecutionPolicy
是 标准策略 之一,则调用 std::terminate。对于任何其他ExecutionPolicy
,行为是实现定义的。 - 如果算法无法分配内存,则抛出 std::bad_alloc。
[编辑] 可能的实现
mismatch (1) |
---|
template<class InputIt1, class InputIt2> std::pair<InputIt1, InputIt2> mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2) { while (first1 != last1 && *first1 == *first2) ++first1, ++first2; return std::make_pair(first1, first2); } |
mismatch (3) |
template<class InputIt1, class InputIt2, class BinaryPred> std::pair<InputIt1, InputIt2> mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPred p) { while (first1 != last1 && p(*first1, *first2)) ++first1, ++first2; return std::make_pair(first1, first2); } |
mismatch (5) |
template<class InputIt1, class InputIt2> std::pair<InputIt1, InputIt2> mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2) { while (first1 != last1 && first2 != last2 && *first1 == *first2) ++first1, ++first2; return std::make_pair(first1, first2); } |
mismatch (7) |
template<class InputIt1, class InputIt2, class BinaryPred> std::pair<InputIt1, InputIt2> mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPred p) { while (first1 != last1 && first2 != last2 && p(*first1, *first2)) ++first1, ++first2; return std::make_pair(first1, first2); } |
[编辑] 示例
此程序确定最长的子字符串,该子字符串同时出现在给定字符串的开头和结尾,反转顺序(可能重叠)。
#include <algorithm> #include <iostream> #include <string> std::string mirror_ends(const std::string& in) { return std::string(in.begin(), std::mismatch(in.begin(), in.end(), in.rbegin()).first); } int main() { std::cout << mirror_ends("abXYZba") << '\n' << mirror_ends("abca") << '\n' << mirror_ends("aba") << '\n'; }
输出
ab a aba
[编辑] 另请参阅
确定两组元素是否相同 (函数模板) | |
(C++11) |
查找第一个满足特定条件的元素 (函数模板) |
如果一个范围在字典序上小于另一个范围,则返回 true (函数模板) | |
搜索元素范围的第一个出现位置 (函数模板) | |
(C++20) |
查找两个范围不同的第一个位置 (niebloid) |