std::equal
定义于头文件 <algorithm>
|
||
(1) | ||
template< class InputIt1, class InputIt2 > bool equal( InputIt1 first1, InputIt1 last1, |
(C++20 前) | |
template< class InputIt1, class InputIt2 > constexpr bool equal( InputIt1 first1, InputIt1 last1, |
(C++20 起) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > bool equal( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, |
(2) | (C++17 起) |
(3) | ||
template< class InputIt1, class InputIt2, class BinaryPredicate > bool equal( InputIt1 first1, InputIt1 last1, |
(C++20 前) | |
template< class InputIt1, class InputIt2, class BinaryPredicate > constexpr bool equal( InputIt1 first1, InputIt1 last1, |
(C++20 起) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPredicate > |
(4) | (C++17 起) |
(5) | ||
template< class InputIt1, class InputIt2 > bool equal( InputIt1 first1, InputIt1 last1, |
(C++14 起) (C++20 前) |
|
template< class InputIt1, class InputIt2 > constexpr bool equal( InputIt1 first1, InputIt1 last1, |
(C++20 起) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > bool equal( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, |
(6) | (C++17 起) |
(7) | ||
template< class InputIt1, class InputIt2, class BinaryPredicate > bool equal( InputIt1 first1, InputIt1 last1, |
(C++14 起) (C++20 前) |
|
template< class InputIt1, class InputIt2, class BinaryPredicate > constexpr bool equal( InputIt1 first1, InputIt1 last1, |
(C++20 起) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPredicate > |
(8) | (C++17 起) |
[first1, last1)
和范围 [first2, first2 + (last1 - first1))
相等,返回 true ,否则返回 false[first1, last1)
和范围 [first2, last2)
相等,返回 true ,否则返回 falsepolicy
执行。这些重载仅若 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> (C++20 前)std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> (C++20 起) 为 true 才参与重载决议。两个范围相等的条件是:对于范围 [first1, last1)
内的每个迭代器 i
, *i 等于 *(first2 + (i - first1)) 。重载形式 (1,2,5,6) 用 operator== 判定两个元素是否相等,而重载形式 (3,4,7,8) 用给定的谓词函数。
参数
first1, last1 | - | 进行比较的第一个范围 |
first2, last2 | - | 进行比较的第二个范围 |
p | - | 若元素应被当做相等则返回 true 的二元谓词。 谓词函数的签名应等价于如下: bool pred(const Type1 &a, const Type2 &b); 虽然签名不必有 const & ,函数也不能修改传递给它的对象,而且必须接受(可为 const 的)类型 |
类型要求 | ||
-InputIt1, InputIt2 必须满足老式输入迭代器 (LegacyInputIterator) 的要求。
|
返回值
[first1, last1)
的长度不等于范围 [first2, last2)
的长度则返回 false 。如果两个范围内的元素都相等,则返回 true 。
否则返回 false 。
注解
std::equal
不可应用到由 std::unordered_set 、 std::unordered_multiset 、 std::unordered_map 或 std::unordered_multimap 的迭代器构成的范围,因为即使此类容器存储相同的元素,在容器内元素存储的顺序也可能不同。
比较整个容器是否相等时,针对该容器的 operator==
重载通常是更好的选择。
复杂度
last1
- first1
次调用相应的谓词函数。last1
- first1
, last2
- first2
) 次调用相应的谓词函数。然而,若 InputIt1
和 InputIt2
满足老式随机访问迭代器 (LegacyRandomAccessIterator) 的要求,且 last1 - first1 != last2 - first2 则不调用谓词函数。
异常
拥有名为 ExecutionPolicy
的模板形参的重载按下列方式报告错误:
- 若作为算法一部分调用的函数的执行抛出异常,且
ExecutionPolicy
为标准策略之一,则调用 std::terminate 。对于任何其他ExecutionPolicy
,行为是实现定义的。 - 若算法无法分配内存,则抛出 std::bad_alloc 。
可能的实现
版本一 |
---|
template<class InputIt1, class InputIt2> bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2) { for (; first1 != last1; ++first1, ++first2) { if (!(*first1 == *first2)) { return false; } } return true; } |
版本二 |
template<class InputIt1, class InputIt2, class BinaryPredicate> bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPredicate p) { for (; first1 != last1; ++first1, ++first2) { if (!p(*first1, *first2)) { return false; } } return true; } |
版本三 |
template<class InputIt1, class InputIt2> bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2 ) { if (distance(first1,last1) != distance(first2,last2) return false; for (; first1 != last1, first2 != last2; ++first1, ++first2) { if (!(*first1 == *first2)) { return false; } } return true; } |
版本四 |
template< class InputIt1, class InputIt2, class BinaryPredicate > bool equal( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPredicate p ) { if (distance(first1,last1) != distance(first2,last2) return false; for (; first1 != last1, first2 != last2; ++first1, ++first2) { if (!p(*first1, *first2)) { return false; } } return true; } |
示例
下面的代码使用 equal()
来测试字符串是否是回文
#include <iostream> #include <algorithm> #include <string> void test(const std::string& s) { if(std::equal(s.begin(), s.begin() + s.size()/2, s.rbegin())) { std::cout << "\"" << s << "\" is a palindrome\n"; } else { std::cout << "\"" << s << "\" is not a palindrome\n"; } } int main() { test("radar"); test("hello"); }
输出:
"radar" is a palindrome "hello" is not a palindrome
参阅
(C++11) |
寻找首个满足特定判别标准的元素 (函数模板) |
当一个范围按字典顺序小于另一个范围时,返回 true (函数模板) | |
寻找两个范围出现不同的首个位置 (函数模板) | |
搜索一个元素范围 (函数模板) |