Пространства имён
Варианты
Действия

std::equal

Материал из cppreference.com
< cpp‎ | algorithm
 
 
Алгоритмы
Функции
Немодифицирующие линейные операции
all_of
any_of
none_of
(C++11)
(C++11)
(C++11)
for_each
count
count_if
mismatch
equal
Модифицирующие линейные операции
Разделение
Сортировка (на отсортированных промежутках)
Бинарный поиск (на отсортированных промежутках)
Множества (на отсортированных промежутках)
Куча
Минимум/максимум
Числовые операции
Библиотека C
 
Определено в заголовочном файле <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)

Возвращает true, если элементы одинаковы в двух диапазонах: одном, определяемом [first1, last1), и другом, начинающемся с first2. Первый вариант функции использует operator== для сравнения элементов, второй вариант использует заданный бинарный предикат p.

Содержание

[править] Параметры

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

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

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

Определение не должно обязательно содержать const &, но функция не должна модифицировать принимаемые объекты.
Типы Type1 и Type2 должны быть таковы, что объекты типов InputIt1 и InputIt2 могут быть разыменованы и затем неявно преобразованы в Type1 и Type2 соответственно.

Требования к типам
-
InputIt1 должен соответствовать требованиям InputIterator.
-
InputIt2 должен соответствовать требованиям InputIterator.

[править] Возвращаемое значение

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

[править] Примечания

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

Для сравнения контейнеров целиком лучше использовать оператор ==.

[править] Сложность

Не больше last1 - first1 применений предиката.

[править] Возможная реализация

Первый вариант
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;
}

[править] Пример

В следующем коде 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 << "\" - палиндром\n";
    } else {
        std::cout << "\"" << s << "\" не палиндром\n";
    }
}
int main()
{
    test("радар");
    test("привет");
}

Вывод:

"радар" - палиндром
"привет" не палиндром
Находит первый элемент, удовлетворяющий определенным критериям
(шаблон функции) [edit]
возвращает истину, если один диапазон лексикографически меньше, чем другой
Оригинал:
returns true if one range is lexicographically less than another
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]
Находит первую позицию, в которой два диапазона отличаются
(шаблон функции) [edit]
Ищет первое вхождение последовательности элементов в диапазон
(шаблон функции) [edit]