Что такое итератор прошедшего конца в STL С++?

Любой может объяснить мне, что означает past-the-end. Почему мы называем функцию end() прошедшей мимо?

Ответ 1

Функции begin() и end() определяют половину открытого диапазона ([begin, end)), что означает:
Диапазон включает первый элемент, но исключает последний элемент. Следовательно, название прошло до конца.

enter image description here

Преимущество полуоткрытого диапазона:

  • Это позволяет избежать специальной обработки пустых диапазонов. Для пустых диапазонов 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]);

он пропустит сортировку последнего символа.

Это также помогает естественным образом представлять пустые контейнеры.