Хранит ли std::set
объекты в непрерывной памяти как std::vector
?
Я не смог найти это в Интернете, cppreference не упоминает подробности о распределении памяти. Но я не понимаю, почему он не может использовать непрерывную память, поэтому мой вопрос.
set::insert
требования: en.cppreference.com/w/cpp/container/set/insert "... Никакие итераторы или ссылки не признаны недействительными ....", поэтому он не может перераспределить, когда ему нужно расширить, как этоstd::vector
делает.std::set
это не одна из тех вещей, которая является ключевой здесь.Ответы:
Нет никаких гарантий, что это так. Также на практике это невозможно из-за требований контейнера. Поэтому нет, он не хранит объекты в непрерывной памяти.
Ссылки на элементы набора должны оставаться действительными при вставке в него, а также при удалении (за исключением ссылок на стертый элемент). Это требование несовместимо с непрерывной памятью.
Насколько я знаю, сбалансированное дерево поиска является единственной структурой данных, которую можно реализовать
std::set
.источник
insert
копирования всех узлов в новый больший блок, чтобы ограничить его только одним блоком, в случае сбоя realloc на месте или (типично для C ++) распределитель не поддерживает такой realloc.)Это не исключено явно, хотя определенные ограничения
std::set
не позволяют использовать непрерывную память.Например,
set::insert
имеет логарифмическую сложность, в то время какvector::insert
требует линейной сложности, чтобы перемешать свои записи. Такжеset::insert
не делает недействительными итераторы. Оба требования не могут быть реализованы с постоянной памятью.источник