Spec-Zone.ru › C++

std::equal

Определено в заголовке <algorithm>
(1)
template< class InputIt1, class InputIt2 >
bool equal( InputIt1 first1, InputIt1 last1,
            InputIt2 first2 );
(до C++20)
template< class InputIt1, class InputIt2 >
constexpr bool equal( InputIt1 first1, InputIt1 last1,
                      InputIt2 first2 );
(с C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
bool equal( ExecutionPolicy&& policy,
            ForwardIt1 first1, ForwardIt1 last1,
            ForwardIt2 first2 );
(2) (с C++17)
(3)
template< class InputIt1, class InputIt2, class BinaryPredicate >
bool equal( InputIt1 first1, InputIt1 last1,
            InputIt2 first2,
            BinaryPredicate p );
(до C++20)
template< class InputIt1, class InputIt2, class BinaryPredicate >
constexpr bool equal( InputIt1 first1, InputIt1 last1,
                      InputIt2 first2,
                      BinaryPredicate p );
(с C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class BinaryPredicate >
bool equal( ExecutionPolicy&& policy,
            ForwardIt1 first1, ForwardIt1 last1,
            ForwardIt2 first2,
            BinaryPredicate p );
(4) (с C++17)
(5)
template< class InputIt1, class InputIt2 >
bool equal( InputIt1 first1, InputIt1 last1,
            InputIt2 first2, InputIt2 last2 );
(с C++14)
(до C++20)
template< class InputIt1, class InputIt2 >
constexpr bool equal( InputIt1 first1, InputIt1 last1,
                      InputIt2 first2, InputIt2 last2 );
(с C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
bool equal( ExecutionPolicy&& policy,
            ForwardIt1 first1, ForwardIt1 last1,
            ForwardIt2 first2, ForwardIt2 last2 );
(6) (с C++17)
(7)
template< class InputIt1, class InputIt2, class BinaryPredicate >
bool equal( InputIt1 first1, InputIt1 last1,
            InputIt2 first2, InputIt2 last2,
            BinaryPredicate p );
(с C++14)
(до C++20)
template< class InputIt1, class InputIt2, class BinaryPredicate >
constexpr bool equal( InputIt1 first1, InputIt1 last1,
                      InputIt2 first2, InputIt2 last2,
                      BinaryPredicate p );
(с C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class BinaryPredicate >
bool equal( ExecutionPolicy&& policy,
            ForwardIt1 first1, ForwardIt1 last1,
            ForwardIt2 first2, ForwardIt2 last2,
            BinaryPredicate p );
(8) (с C++17)
1,3) Возвращает true, если диапазон [first1, last1) равен диапазону [first2, first2 + (last1 - first1)), и false в противном случае.
5,7) Возвращает true, если диапазон [first1, last1) равен диапазону [first2, last2), и false в противном случае.
2,4,6,8) То же, что и (1,3,5,7), но выполняется в соответствии с policy. Эти перегрузки не участвуют в разрешении перегрузки, если

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)

Два диапазона считаются равными, если они имеют одинаковое количество элементов и для каждого итератора i в диапазоне [first1, last1), *i равно *(first2 + (i - first1)). Перегрузки (1,2,5,6) используют operator== для определения, равны ли два элемента, в то время как перегрузки (3,4,7,8) используют заданный бинарный предикат p.

Параметры

first1, last1 - первый диапазон элементов для сравнения
first2, last2 - второй диапазон элементов для сравнения
policy - используемая политика выполнения. Подробнее см. политика выполнения.
p - бинарный предикат, возвращающий ​true, если элементы следует считать равными.

Подпись функции предиката должна быть эквивалентна следующей:

bool pred(const Type1 &a, const Type2 &b);

Хотя подпись не обязательно должна содержать const &, функция не должна изменять передаваемые ей объекты и должна уметь принимать все значения типа (возможно, const) Type1 и Type2 независимо от категории значений (поэтому Type1 & недопустимо, а также Type1 за исключением случая, когда для Type1 перемещение эквивалентно копированию(с C++11)).
Типы Type1 и Type2 должны быть такими, чтобы объекты типов InputIt1 и InputIt2 можно было разыменовывать и затем неявно преобразовывать в Type1 и Type2 соответственно. ​

Требования к типу
-InputIt1, InputIt2 должно удовлетворять требованиям LegacyInputIterator.
-ForwardIt1, ForwardIt2 должно удовлетворять требованиям LegacyForwardIterator.

Возвращаемое значение

5-8) Если длина диапазона [first1, last1) не равна длине диапазона [first2, last2), возвращает false.

Если элементы в двух диапазонах равны, возвращает true.

В противном случае возвращает false.

Примечания

std::equal не следует использовать для сравнения диапазонов, образованных итераторами из std::unordered_set, std::unordered_multiset, std::unordered_map, или std::unordered_multimap из-за того, что порядок хранения элементов в этих контейнерах может отличаться, даже если два контейнера содержат одни и те же элементы.

При сравнении целых контейнеров на равенство обычно предпочтительны operator== соответствующего контейнера.

Сложность

1,3) Максимум last1 - first1 применений предиката.
5,7) Максимум min(last1 - first1, last2 - first2) применений предиката.
Однако, если InputIt1 и InputIt2 удовлетворяют требованиям LegacyRandomAccessIterator и last1 - first1 != last2 - first2 , то никаких применений предиката не происходит (несоответствие размеров обнаруживается без проверки каких-либо элементов).
2,4,6,8) То же самое, но сложность указывается как O(x), а не «максимум x».

Исключение

Перегрузки с параметром шаблона с именем ExecutionPolicy сообщают об ошибках следующим образом:

  • Если выполнение функции, вызванной как часть алгоритма, вызывает исключение, а ExecutionPolicy - одна из стандартных политик, std::terminate вызывается. Для любой другой ExecutionPolicy, поведение определяется реализацией.
  • Если алгоритм не может выделить память, выбрасывается std::bad_alloc.

Возможная реализация

equal (1)
template<class InputIt1, class InputIt2>
constexpr //< since C++20
bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2)
{
    for (; first1 != last1; ++first1, ++first2)
        if (!(*first1 == *first2))
            return false;
 
    return true;
}
equal (3)
template<class InputIt1, class InputIt2, class BinaryPredicate>
constexpr //< since C++20
bool equal(InputIt1 first1, InputIt1 last1,
           InputIt2 first2, BinaryPredicate p)
{
    for (; first1 != last1; ++first1, ++first2)
        if (!p(*first1, *first2))
            return false;
 
    return true;
}

Пример

Следующий код использует std::equal для проверки, является ли строка палиндромом.

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <string_view>
 
constexpr bool is_palindrome(const std::string_view& s)
{
    return std::equal(s.cbegin(), s.cbegin() + s.size() / 2, s.crbegin());
}
 
void test(const std::string_view& s)
{
    std::cout << std::quoted(s)
              << (is_palindrome(s) ? " is" : " is not")
              << " a palindrome\n";
}
 
int main()
{
    test("radar");
    test("hello");
}

Вывод:

"radar" is a palindrome
"hello" is not a palindrome

См. также

findfind_iffind_if_not
(C++11)
находит первый элемент, удовлетворяющий определённым критериям
(функция-шаблон)
lexicographical_compare
возвращает true если один диапазон лексикографически меньше другого
(функция-шаблон)
mismatch
находит первую позицию, где два диапазона различаются
(функция-шаблон)
search
выполняет поиск диапазона элементов
(функция-шаблон)
ranges::equal
(C++20)
определяет, совпадают ли два набора элементов
(niebloid)
equal_to
объект-функция, реализующий x == y
(шаблон класса)
equal_range
возвращает диапазон элементов, соответствующих заданному ключу
(функция-шаблон)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/equal

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API