Любой может объяснить мне, что означает past-the-end. Почему мы называем функцию end() прошедшей мимо?
Что такое итератор прошедшего конца в STL С++?
Ответ 1
Функции begin() и end() определяют половину открытого диапазона ([begin, end)), что означает:
Диапазон включает первый элемент, но исключает последний элемент. Следовательно, название прошло до конца.

Преимущество полуоткрытого диапазона:
-
Это позволяет избежать специальной обработки пустых диапазонов. Для пустых диапазонов
begin()равенend(). -
Это делает конечный критерий простым для циклов, которые перебирают элементы: петли просто продолжайте, пока
end()не достигнут
Ответ 2
Поскольку он не указывает на элемент last контейнера, а где-то прошлый последний элемент контейнера.
Если вы разыскиваете end(), это приводит к undefined поведению.
Ответ 3
Подобно интервалу в математике, stl использует [begin, end).
Вот почему мы могли написать for (auto it = v.begin(); it != v.end(); ++it)
Ответ 4
Буквально, потому что он указывает один за концом массива.
Используется потому, что этот элемент пуст и может быть итерационным, но не разыменованным.
int arry[] = {1, 2, 3, 4, /* end */ };
^^^^^^^
std::end(arry) would point here.
Ответ 5
Добавление другой точки к приведенным выше правильным ответам. Это также было сделано для совместимости с массивами. Например, в приведенном ниже коде:
char arr[5];
strcpy(arr, "eakgl");
sort(&arr[0], &arr[5]);
Это будет нормально работать.
Вместо этого, если бы вы дали:
sort(&arr[0], &arr[4]);
он пропустит сортировку последнего символа.
Это также помогает естественным образом представлять пустые контейнеры.