Ошибки заборного столба (fencepost errors), часть II

Раннее.

Тащемта у Б.Страуструпа в 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-цикл. Это вполне работает, но тогда будет труднее читать код --- инициализация цикла вверху, а условие выхода из цикла внизу.


Тащемта, если коротко обобщить, то наверное многие ошибки заборного столба появляются из-за того что путают закрытые интервалы и полу-открытые. И не только в программировании, в жизни вообще.

(the post first published at 20250415.)


List of my other blog posts.

Subscribe to my news feed,

Когда-то (перед 24-марта-2025) тут для комментов был скрипт на JS --- Disqus. Я его убрал --- он был слишком пёстрый, отвлекающий, анимированный, и слишком много рекламы там было. Никогда его не любил. Также, комменты не всегда появлялись (Disqus был глючный). Также, блог у меня слишком камерный --- не очень-то много людей мне тут пишут комменты. Так что я решил переключиться на модель что у меня уже была по крайней мере в 2020 --- присылаете мне комменты емейлом на blog at yurichev dot com (и не забудьте указать URL на этот пост в блоге) и я их сюда копи-пащу вручную и может быть отвечу.

Будем тусить так, будто бы сейчас ~1993-1996, в этом радикальном и бескомпромисно-примитивном блоге и сайте, в том стиле что был еще перед web1.0.