Что делают std:: equal overloads?

Я смотрю последние перегрузки С++ 14 для std::equal, и я не могу понять, что они делают и используются для...

Две перегрузки:

template< class InputIt1, class InputIt2 >
bool equal( InputIt1 first1, InputIt1 last1, 
            InputIt2 first2, InputIt2 last2 );

template< class InputIt1, class InputIt2, class BinaryPredicate >
bool equal( InputIt1 first1, InputIt1 last1, 
            InputIt2 first2, InputIt2 last2,
            BinaryPredicate p );

Я полностью понимаю традиционный std::equal, который использует только один InputIt2, но второй InputIt2 last2 скручивает мой мозг. Может ли кто-нибудь объяснить и привести пример этого?

Ответ 1

Новые перегрузки на самом деле очень большие. Вы передаете два полных диапазона, начиная и заканчивая, а вместо того, чтобы сбежать от конца более короткого и вызвать поведение undefined, алгоритм останавливается.

Такие улучшения были также добавлены к std::mismatch и std::is_permutation. Подробнее об этом можно узнать в .

Для std::equal алгоритм просто вернет false, если длины не равны.
Для std::mismatch, если алгоритм попадает в конец одного диапазона, он вернет этот итератор и соответствующий им итератор из другого диапазона.
Для std::is_permutation алгоритм также просто возвращает false, если диапазоны не равны по длине.

Для рассуждений о том, почему, подумайте, что программист, проверяющий длину, не обязательно возможен или дешев. Диапазон, полученный от a std::list без исходного списка, должен быть пройден, чтобы получить размер. Диапазон, который использует InputIterator, например, для чтения со стандартного ввода, потенциально бесконечен до тех пор, пока он не достигнет конца, и ему разрешено проходить через один раз, поэтому алгоритм больше не сможет использовать его после этого. Спасибо Бенджамину Линдли ниже за последний пример.