std::equal
在头文件 <algorithm> 中定义
|
||
template< class InputIt1, class InputIt2 > bool equal( InputIt1 first1, InputIt1 last1, |
(1) | |
template< class InputIt1, class InputIt2, class BinaryPredicate > bool equal( InputIt1 first1, InputIt1 last1, |
(2) | |
template< class InputIt1, class InputIt2 > bool equal( InputIt1 first1, InputIt1 last1, |
(3) | (C++14 起) |
template< class InputIt1, class InputIt2, class BinaryPredicate > bool equal( InputIt1 first1, InputIt1 last1, |
(4) | (C++14 起) |
[first1, last1)
和区间[first2, first2 + (last1 - first1)
相等,返回true,否则返回false[first1, last1)
和区间[first2, last2
相等,返回true,否则返回false两个区间相等的条件是:对于区间[first1, last1)
内的每个迭代器i
,*i等于*(first2 + (i - first1))。重载形式(1)和(3)使用operator==判定两个元素是否相等,而重载形式(2)和(4)使用的是给定的谓词函数。
目录 |
[编辑] 参数
first1, last1 | - | 进行比较的第一个区间 |
first2, last2 | - | 进行比较的第二个区间 |
p | - | binary predicate which returns true if the elements should be treated as equal. The signature of the predicate function should be equivalent to the following: bool pred(const Type1 &a, const Type2 &b); The signature does not need to have const &, but the function must not modify the objects passed to it. |
类型要求 | ||
-InputIt1, InputIt2 必须满足 InputIterator 的要求。
|
[编辑] 返回值
[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
满足RandomAccessIterator
的要求,且last1 - first1 != last2 - first2则不会调用谓词函数。[编辑] 可能的实现
版本一 |
---|
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 palindrome\n"; } } int main() { test("radar"); test("hello"); }
输出:
"radar" is a palindrome "hello" is not palindrome
(C++11) |
查找满足特定条件的第一个元素 (函数模板) |
如果一个区间按字典顺序小于另一个区间,返回true (函数模板) | |
查找两个范围第一个不同元素的位置 (函数模板) | |
查找一个元素区间 (函数模板) |