std::equal

来自cppreference.com
< cpp‎ | algorithm
 
 
算法库
功能
原文:
Functions
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
修改序列操作
原文:
Non-modifying sequence operations
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
all_of
any_of
none_of
(C++11)
(C++11)
(C++11)
for_each
count
count_if
mismatch
equal
修改序列操作
原文:
Modifying sequence operations
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
分区操作
原文:
Partitioning operations
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
is_partitioned(C++11)
partition
partition_copy(C++11)
排序操作(排序的区间)
原文:
Sorting operations (on sorted ranges)
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
is_sorted(C++11)
is_sorted_until(C++11)
sort
二进制搜索操作(排序的区间)
原文:
Binary search operations (on sorted ranges)
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
设置操作(排序的区间)
原文:
Set operations (on sorted ranges)
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
堆的操作
原文:
Heap operations
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
最小/最大操作
原文:
Minimum/maximum operations
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
数字操作
原文:
Numeric operations
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
C库
原文:
C library
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
 
定义于头文件 <algorithm>
template< class InputIt1, class InputIt2 >

bool equal( InputIt1 first1, InputIt1 last1,

            InputIt2 first2 );
(1)
template< class InputIt1, class InputIt2, class BinaryPredicate >

bool equal( InputIt1 first1, InputIt1 last1,

            InputIt2 first2, BinaryPredicate p );
(2)
template< class InputIt1, class InputIt2 >

bool equal( InputIt1 first1, InputIt1 last1,

            InputIt2 first2, InputIt2 last2 );
(3) (C++14起)
template< class InputIt1, class InputIt2, class BinaryPredicate >

bool equal( InputIt1 first1, InputIt1 last1,
            InputIt2 first2, InputIt2 last2,

            BinaryPredicate p );
(4) (C++14起)
1,2) 如果区间[first1, last1)和区间[first2, first2 + (last1 - first1)相等,返回true,否则返回false
3,4) 如果区间[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.
类型 Type1Type2 必须能使类型 InputIt1InputIt2 的对象能够被解引用并隐式转换为相应的 Type1Type2

类型要求
-
InputIt1, InputIt2 必须满足 InputIterator 的要求。

[编辑] 返回值

3,4) 如果区间[first1, last1)的长度不等于区间[first2, last2)的长度返回false

如果两个区间内的元素都相等,返回true,否则返回false

[编辑] 注释

std::equal不能用于由std::unordered_setstd::unordered_multisetstd::unordered_mapstd::unordered_multimap的迭代器构成的区间,因为即使此类容器存储相同的元素,在容器内元素存储的顺序也可能不同。

比较整个容器是否相等时,针对该容器的operator== 重载通常是更好的选择。

[编辑] 复杂度

1,2) 最多last1 - first1次调用相应的谓词函数。
3,4) 最多min(last1 - first1, last2 - first2)次调用相应的谓词函数。
然而,若InputIt1InputIt2满足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
查找满足特定条件的第一个元素
(函数模板) [edit]
如果按字典顺序一个区间小于另一个区间,返回true
(函数模板) [edit]
查找两个范围第一个不同元素的位置
(函数模板) [edit]
查找一个元素区间
(函数模板) [edit]