Ответ 1
Новые перегрузки на самом деле очень большие. Вы передаете два полных диапазона, начиная и заканчивая, а вместо того, чтобы сбежать от конца более короткого и вызвать поведение undefined, алгоритм останавливается.
Такие улучшения были также добавлены к std::mismatch
и std::is_permutation
. Подробнее об этом можно узнать в .
Для std::equal
алгоритм просто вернет false
, если длины не равны.
Для std::mismatch
, если алгоритм попадает в конец одного диапазона, он вернет этот итератор и соответствующий им итератор из другого диапазона.
Для std::is_permutation
алгоритм также просто возвращает false
, если диапазоны не равны по длине.
Для рассуждений о том, почему, подумайте, что программист, проверяющий длину, не обязательно возможен или дешев. Диапазон, полученный от a std::list
без исходного списка, должен быть пройден, чтобы получить размер. Диапазон, который использует InputIterator
, например, для чтения со стандартного ввода, потенциально бесконечен до тех пор, пока он не достигнет конца, и ему разрешено проходить через один раз, поэтому алгоритм больше не сможет использовать его после этого. Спасибо Бенджамину Линдли ниже за последний пример.