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