Heim > Backend-Entwicklung > C++ > Wie erreicht „std::unordered_map' eine hohe Leistung und behält gleichzeitig die Iteratorgültigkeit bei?

Wie erreicht „std::unordered_map' eine hohe Leistung und behält gleichzeitig die Iteratorgültigkeit bei?

Patricia Arquette
Freigeben: 2024-12-09 13:00:16
Original
914 Leute haben es durchsucht

How Does `std::unordered_map` Achieve High Performance While Maintaining Iterator Validity?

std::unordered_map-Implementierung: Ein genauerer Blick

Der std::unordered_map-Container in C hat Diskussionen über seine Implementierung und Effizienz ausgelöst. Um Licht in dieses Thema zu bringen, untersuchen wir, wie diese Datenstruktur realisiert wird.

Separate Verkettung mit verknüpften Listen

Im Kern verwendet unordered_map eine Technik namens separate Verkettung , auch als offenes Hashing bekannt. Dazu gehört die Verwaltung eines Arrays von Buckets, wobei jeder Bucket eine verknüpfte Liste von Elementen mit kollidierenden Hash-Schlüsseln enthält. Diese Designwahl ergibt sich aus der Anforderung im C-Standard, dass Iteratoren zu Elementen auch dann gültig bleiben, wenn andere Elemente eingefügt oder gelöscht werden.

Größenänderung und erneutes Aufwärmen

Zur Aufrechterhaltung der Leistung , unordered_map verwendet Größenänderung und erneutes Aufwärmen. Eine Größenänderung erfolgt, wenn die Anzahl der Elemente die aktuelle Bucket-Anzahl multipliziert mit dem maximalen Lastfaktor überschreitet, der standardmäßig 1,0 beträgt. Beim erneuten Aufwärmen wird eine neue Reihe von Buckets mit einer größeren Kapazität erstellt, und alle vorhandenen Elemente werden erneut aufbereitet und in den entsprechenden Buckets platziert.

Einschränkungen

Bei separater Verkettung Obwohl es für allgemeine Anwendungen effektiv ist, gibt es Einschränkungen. In bestimmten Szenarien kann geschlossenes Hashing (offene Adressierung) erhebliche Leistungsvorteile in Bezug auf Geschwindigkeit und Speichernutzung bieten. Die offene Adressierung führt jedoch zu Komplexitäten, wie z. B. der Unterscheidung zwischen freien und besetzten Positionen und der Handhabung der Kollisionsauflösung.

Die „Aufsicht“ im Standard

Die Anforderung, den Iterator beizubehalten Die Gültigkeit wurde von einigen Kritikern als „Versehen“ bezeichnet. Es war jedoch eine bewusste Entscheidung des C-Komitees, der Iteratorstabilität Priorität einzuräumen. Diese Wahl gewährleistet, dass unordered_map in Situationen verwendet werden kann, in denen Iteratoren und Referenzen während Einfüge- und Löschvorgängen intakt bleiben müssen.

Fazit

Die Implementierung von std::unordered_map bringt Allgemeingültigkeit, Leistung und Einhaltung des C-Standards in Einklang. Die separate Verkettung mit verknüpften Listen stellt die Gültigkeit des Iterators sicher, während Größenänderung und erneutes Aufwärmen die Leistung optimieren. Trotz möglicher Einschränkungen in bestimmten Szenarien bleibt unordered_map eine vielseitige und weit verbreitete Datenstruktur für die Verarbeitung hashbasierter Einfügungen und Suchvorgänge.

Das obige ist der detaillierte Inhalt vonWie erreicht „std::unordered_map' eine hohe Leistung und behält gleichzeitig die Iteratorgültigkeit bei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage