Czy std::set
przechowuje obiekty w ciągłej pamięci std::vector
?
Nie udało mi się tego znaleźć w Internecie, cppreference nie wspomina o szczegółach przydzielania pamięci. Ale nie rozumiem, dlaczego nie może używać ciągłej pamięci, stąd moje pytanie.
set::insert
wymagania: en.cppreference.com/w/cpp/container/set/insert „... Żadne iteratory lub referencje nie są unieważniane ...”, więc nie można dokonać ponownego przydzielenia, gdy trzeba je rozwinąć tak jakstd::vector
robi.std::set
nie jest to jedna z tych rzeczy, co jest tutaj kluczem.Odpowiedzi:
Nie ma gwarancji, że tak będzie. Również w praktyce nie jest to możliwe z powodu wymagań kontenera. Dlatego nie, nie przechowuje obiektów w ciągłej pamięci.
Odniesienia do elementów zestawu muszą pozostać ważne po wstawieniu do niego, a także po usunięciu (z wyjątkiem odniesień do usuniętego elementu). To wymaganie jest niezgodne z ciągłą pamięcią.
O ile mi wiadomo, zrównoważone drzewo wyszukiwania jest jedyną strukturą danych, którą można wdrożyć
std::set
.źródło
insert
kopiowanie wszystkich węzłów do nowego większego bloku, aby ograniczyć go tylko do jednego bloku, w przypadku niepowodzenia lokalnego przeniesienia lub (typowy dla C ++) alokator nie obsługuje takiego ponownego przeniesienia.)Nie jest to wyraźnie wykluczone, choć pewne ograniczenia
std::set
uniemożliwiają korzystanie z ciągłej pamięci.Na przykład
set::insert
ma złożoność logarytmiczną, alevector::insert
wymaga złożoności liniowej, aby przetasować wpisy. Równieżset::insert
nie unieważnia iteratory. Oba wymagania nie mogą być spełnione przy pomocy pamięci ciągłej.źródło