Что делают перегрузки std::equal?

Я смотрю на недавние перегрузки c++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 ответов


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

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

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

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