Gefällt es std::set
, Objekte im zusammenhängenden Speicher zu speichern std::vector
?
Ich konnte dies nicht im Web finden, cppreference erwähnt keine Details zur Speicherzuweisung. Aber ich kann nicht verstehen, warum es kein zusammenhängendes Gedächtnis verwenden konnte, daher meine Frage.
set::insert
Anforderungen: en.cppreference.com/w/cpp/container/set/insert "... Keine Iteratoren oder Referenzen werden ungültig gemacht ...", sodass keine Neuzuweisung möglich ist, wenn eine Erweiterungstd::vector
erforderlich ist.std::set
ist nicht eines dieser Dinge, die hier der Schlüssel ist.Antworten:
Es gibt keine Garantie dafür. Auch in der Praxis kann es aufgrund der Anforderungen des Containers nicht. Daher nein, es werden keine Objekte im zusammenhängenden Speicher gespeichert.
Verweise auf Elemente des Satzes müssen beim Einfügen sowie beim Löschen gültig bleiben (mit Ausnahme von Verweisen auf das gelöschte Element). Diese Anforderung ist nicht mit dem zusammenhängenden Speicher kompatibel.
Soweit ich weiß, ist ein ausgeglichener Suchbaum die einzige Datenstruktur, die implementiert werden kann
std::set
.quelle
insert
Kopieren aller Knoten in einen neuen größeren Block aus, um ihn auf nur einen Block zu beschränken, falls die direkte Neuzuweisung fehlschlägt oder (typisch für C ++) der Zuweiser eine solche Neuzuweisung nicht unterstützt.)Es wird nicht explizit ausgeschlossen, obwohl bestimmte Einschränkungen
std::set
es unmöglich machen, zusammenhängenden Speicher zu verwenden.Zum Beispiel
set::insert
hat logarithmische Komplexität, währendvector::insert
lineare Komplexität erforderlich ist, um seine Einträge zu mischen. Auchset::insert
macht Iteratoren nicht ungültig. Beide Anforderungen können mit einem kontinuierlichen Speicher nicht realisiert werden.quelle