Тащемта у Б.Страуструпа в TC++PL 4ed (2013) юзаются полу-открытые интервалы:
int∗ find(int∗ first, int∗ last, int v) // find x in [first:last) { while (first!=last && ∗first!=v) ++first; return first; } ... The simple version of accumulate() adds elements of a sequence using their + operator: template<typename In, typename T> T accumulate(In first, In last, T init) { for (; first!=last; ++first) // for all elements in [first:last) init = init + ∗first; // plus return init; } ... // Sample the remaining values in [first+n:last) by selecting a random // number r in the range [0:k], and, if r<n, replace it. ... for (Size k = n; first!=last; ++first,++k) { Size r = dist(gen,Param{0,k}); if(r < n) ∗(result + r) = ∗first; } ... Given a sorted sequence [first:last), equal_range() will return the pair representing the subsequence that matches the predicate cmp.
А вот еще:
[begin, end) – iterator pairs, e.g. ranges made by implicit conversion from containers. All algorithms that take iterator pairs now have overloads that accept ranges (e.g. ranges::sort) ... begin + [0, size) – counted sequences, e.g. range returned by views::counted
( src )
Конечно, в C++ STL .begin() указывает на первый элемент, а .end() на ХЗ что за последним элементом. Так удобнее. В чистом Си, либо же просто в разных структурах данных, подобные фальшивые элементы за концом называют еще sentinel node. Они упрощают алгоритмы работы с этими структурами. Тот кто создавал STL (А.Степанов же?) продолжил так делать, и это логично.
Поэтому в STL цикл обыкновенно:
for (auto it=some_list.begin(); it!=some_list.end(); it++) { };
Формально, выбираются элементы в (полу-открытом) интервале [some_list.begin(), some_list.end()).
Ну а теперь мысленный эксперимент --- представьте что .end() указывает на последний элемент и перепишите цикл... Как это вообще возможно сделать, чтобы потом можно было смотреть на него без слёз? Придется условие внизу добавлять, ну или юзать do-while-цикл. Это вполне работает, но тогда будет труднее читать код --- инициализация цикла вверху, а условие выхода из цикла внизу.
Тащемта, если коротко обобщить, то наверное многие ошибки заборного столба появляются из-за того что путают закрытые интервалы и полу-открытые. И не только в программировании, в жизни вообще.
Когда-то (перед 24-марта-2025) тут для комментов был скрипт на JS --- Disqus. Я его убрал --- он был слишком пёстрый, отвлекающий, анимированный, и слишком много рекламы там было. Никогда его не любил. Также, комменты не всегда появлялись (Disqus был глючный). Также, блог у меня слишком камерный --- не очень-то много людей мне тут пишут комменты. Так что я решил переключиться на модель что у меня уже была по крайней мере в 2020 --- присылаете мне комменты емейлом на blog at yurichev dot com (и не забудьте указать URL на этот пост в блоге) и я их сюда копи-пащу вручную и может быть отвечу.
Будем тусить так, будто бы сейчас ~1993-1996, в этом радикальном и бескомпромисно-примитивном блоге и сайте, в том стиле что был еще перед web1.0.