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