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) |
true, если диапазон [first1, last1) равен диапазону [first2, first2 + (last1 - first1)), и false в противном случае.true, если диапазон [first1, last1) равен диапазону [first2, last2), и false в противном случае.policy. Эти перегрузки не участвуют в разрешении перегрузки, если |
| (до C++20) |
|
| (с 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, если элементы следует считать равными. Подпись функции предиката должна быть эквивалентна следующей:
Хотя подпись не обязательно должна содержать |
| Требования к типу | ||
-InputIt1, InputIt2 должно удовлетворять требованиям LegacyInputIterator. |
||
-ForwardIt1, ForwardIt2 должно удовлетворять требованиям LegacyForwardIterator. |
||
Возвращаемое значение
[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.
Возможная реализация
| 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
См. также
|
(C++11) | находит первый элемент, удовлетворяющий определённым критериям (функция-шаблон) |
возвращает true если один диапазон лексикографически меньше другого (функция-шаблон) |
|
| находит первую позицию, где два диапазона различаются (функция-шаблон) |
|
| выполняет поиск диапазона элементов (функция-шаблон) |
|
|
(C++20) | определяет, совпадают ли два набора элементов (niebloid) |
объект-функция, реализующий x == y (шаблон класса) |
|
| возвращает диапазон элементов, соответствующих заданному ключу (функция-шаблон) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/algorithm/equal