Файл заголовка equal.hpp содержит два варианта алгоритма stl.<equal
>. Алгоритм проверяет, содержат ли две последовательности одинаковые значения.
До (предложенного) C++14 алгоритм<std::equal
>взяли три итератора и необязательный сравнительный предикат. Первые два итератора<[first1,last1)
>определили последовательность, а второй<first2
>определил начало второй последовательности. Предполагается, что вторая последовательность имеет ту же длину, что и первая.
В C++14 были введены два новых варианта, берущие четыре итератора и необязательный сравнительный предикат. Четыре итератора определяют две последовательности<[first1,last1)
>и<[first2,last2)
>явно, а не определяют вторую неявно. Это приводит к правильным ответам в большем количестве случаев (и избегать неопределенного поведения в других).
Рассмотрим две последовательности:
auto seq1 = { 0, 1, 2 };
auto seq2 = { 0, 1, 2, 3, 4 };
std::equal ( seq1.begin (), seq1.end (), seq2.begin ());
std::equal ( seq2.begin (), seq2.end (), seq1.begin ());
std::equal ( seq1.begin (), seq1.end (), seq2.begin (), seq2.end ());
Вы можете утверждать, что<true
>является правильным ответом в первом случае, даже если последовательности не одинаковы. Первые N в<seq2
>те же, что и в<seq1
>, но это не все, что в<seq2
>. Но во втором случае алгоритм будет читать дальше конца<seq1
>, что приведет к неопределенному поведению (большое землетрясение, неправильные результаты, беременная кошка и т. д.).
Однако, если две последовательности указаны полностью, ясно, что они не равны.
Функция<equal
>возвращается истинной, если две последовательности сравниваются равными; т.е. если каждый элемент в последовательности сравнивается с соответствующим элементом в другой последовательности. Одна версия использует<std::equal_to
>для сравнения; другая позволяет абоненту передать предикат для сравнения.
template <class InputIterator1, class InputIterator2>
bool equal ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2 );
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2, BinaryPredicate pred );
<c1
>, содержащее<{0,1,
2,3,14,15}
>, и<c2
>содержащее<{1,
2,3}
>, то
equal ( c1.begin (), c1.end (), c2.begin (), c2.end ()) --> false
equal ( c1.begin () + 1, c1.begin () + 3, c2.begin (), c2.end ()) --> true
equal ( c1.end (), c1.end (), c2.end (), c2.end ()) --> true
<equal
>работает на всех итераторах, кроме выходных итераторов.
Оба варианта<equal
>работают вO(N)(линейное) время; то есть они сравниваются с каждым элементом в списке один раз. Если последовательность не будет найдена равной в какой-либо точке, рутина прекратится немедленно, без изучения остальных элементов.
Оба варианта<equal
>берут свои параметры по стоимости и не зависят ни от какого глобального государства. Таким образом, все процедуры в этом файле обеспечивают сильную гарантию исключения.
- Четыре итератора версии рутины<
equal
>является частью стандарта C++14. Когда стандартные библиотеки C++14 становятся доступными, следует использовать реализацию из стандартной библиотеки. - <
equal
>возвращается истинно для двух пустых диапазонов, независимо от того, какой предикат передается для проверки против.