Я знаю, что стандарт не определяет способ, которым должны быть реализованы контейнеры STL, а скорее задает набор требований для каждого из них.
Однако широко известно, что заказанные контейнеры STL обычно реализуются как красно-черные деревья.
Вы можете выполнять итерацию через элементы std::set
или std::map
с помощью своих соответствующих итераторов или с С++ 11 с использованием диапазонных циклов.
Что меня озадачивает, так это то, как упорядоченный контейнер в STL "знает", все кончено". Или иначе, поскольку они реализованы как деревья, как реализуется конец контейнера или может быть реализованы?
Я знаю, что стандарт диктует §23.2.1/c Общие требования к контейнеру (Emphasis Mine):
begin() возвращает итератор, ссылающийся на первый элемент в контейнер. end() возвращает итератор, который является последним значением для контейнера. Если контейнер пуст, тогда begin() == end();
ОК, для смежных контейнеров это легко, но как это "прошлое-end" может быть реализовано для деревьев?