Что делают перегрузки 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
, например, для чтения со стандартного ввода, потенциально бесконечно, пока он не достигнет конца, и разрешено проходить только один раз, поэтому алгоритм больше не может использовать его после этого. Поблагодарите Бенджамина Линдли за этот последний пример.