Любой может объяснить мне, что означает 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]);
он пропустит сортировку последнего символа.
Это также помогает естественным образом представлять пустые контейнеры.