
О понятии Sentinel говорят мало, особенно в русскоязычном пространстве. Вместе с Юрием Вашинко, опытным тимлидом и спикером нашего курса «С++ разработчик» сегодня рассмотрим, что такое Sentinel и как его использовать:
В каждом разработчике С++ (до 17 версии) прочно укоренилось понятие итератора, на котором построена по сути вся работа со контейнерами в STL. Но бывают случаи, когда приходится отказываться от использования алгоритмов в угоду собственных реализаций, т.к. они оказываются более выгодными с точки зрения эффективности.
Для начала давайте напомним всем известные понятия. Контейнеры предоставляют нам итераторы begin() и end(), где begin() указывает на первый элемент контейнера, а end() на «мифический» элемент, который находится «сразу з»” последним элементом. И вот когда начинающие разработчики с этим знакомятся — тут бывает много интересного. Все представляют в первую очередь std::vector, и там можно представить, что находится в конце. Но если спросить — а что же будет, если этим контейнером является std::map — ответы будут разные. Да и объяснить бывает непросто, что этот элемент, по сути, нереальный.
Лично для меня итератор end() вообще выбивается из хардкорного, строго типизированного и структурированного языка С++. На момент создания и реализации данной концепции это было хорошим решением, но времена меняются и задачи тоже. Подумаем, а что нам делать, если обрабатывать массив нужно не весь, а закончить обработку в зависимости от значения внутри вектора. Или, к примеру, мы хотим создать бесконечный массив, то есть постоянно дополняемый. Что в таком случае считать признаком окончания? И вот для такого рода задач понимаешь, что нет ничего лучше чем прохода в виде while(true) и выходом по условию.
Для примера возьмем задачу, где нам нужно первое слово в предложении преобразовать в uppercase. (Опустим здесь зачем это может понадобится. Многообразие задач заказчика настолько велико, что самая нереальная и порой глупая задача на сегодняшний день может стать острой необходимостью завтра
