C ++ deque vs Vektor und C ++ map vs Set

7

Kann mir jemand sagen, was der Unterschied zwischen Vektor und Deque ist? Ich kenne die Implementierung von Vektor in C ++, aber nicht deque. Auch Schnittstellen von Karte und Set scheinen mir ähnlich zu sein. Was ist der Unterschied zwischen den beiden und wann zu verwenden?

    
brett 13.09.2010, 20:46
quelle

4 Antworten

42

std :: vector : Eine dynamische Array-Klasse. Die interne Speicherzuordnung stellt sicher, dass immer ein Array erstellt wird. Nützlich, wenn die Größe der Daten bekannt ist und bekannt ist, dass sie sich nicht zu oft ändert. Es ist auch gut, wenn Sie einen zufälligen Zugriff auf Elemente haben möchten.
std :: deque : Eine doppelendige Warteschlange, die als Stapel oder Warteschlange fungieren kann. Gut, wenn Sie sich über die Anzahl der Elemente nicht sicher sind und der Zugriff auf das Datenelement immer seriell erfolgt. Sie sind schnell, wenn Elemente am Anfang und am Ende hinzugefügt / entfernt werden, aber nicht, wenn sie in der Mitte hinzugefügt / entfernt werden.
std :: list : Eine doppelt verknüpfte Liste, die zum Erstellen einer" Liste "von Daten verwendet werden kann. Der Vorteil einer Liste besteht darin, dass Elemente aus einem beliebigen Teil der Liste eingefügt oder gelöscht werden können, ohne einen Iterator zu beeinflussen, der auf einen Listenmember verweist (und nach dem Löschen immer noch Mitglied der Liste ist). Nützlich, wenn Sie wissen, dass Elemente aus einem beliebigen Teil der Liste sehr oft gelöscht werden.
Std: : map : Ein Wörterbuch, das einen 'Schlüssel' einem 'Wert' zuordnet. Nützlich für Anwendungen wie 'Arrays', deren Index keine Ganzzahl ist. Im Grunde kann man eine map-Liste des Namens für ein Element erstellen, wie eine Karte, in der die Name-zu-Widget-Beziehung gespeichert wird.
std :: set : Eine Liste von 'eindeutigen' Datenwerten. Für z.B. Wenn Sie 1, 2, 2, 1, 3 einfügen, enthält die Liste nur die Elemente 1, 2, 3. Beachten Sie, dass die Elemente in dieser Liste immer geordnet sind. Intern werden sie normalerweise als binäre Suchbäume (wie map) implementiert.

    
Vite Falcon 13.09.2010, 20:56
quelle
3

Hier finden Sie alle Details:

Was sind die Komplexitätsgarantien der Standardcontainer?

Vektor Vs deque

Ein Deque ist dasselbe wie ein Vektor, aber mit dem folgenden Zusatz:

  • Es ist eine "Front-Insertion-Sequenz"

Dies bedeutet, dass deque dasselbe wie ein Vektor ist, aber die folgenden zusätzlichen Garantien bietet:

  • push_front () O (1)
  • pop_front () O (1)

setze Vs map

Eine Map ist ein "Paar assoziativer Container", während set ein "einfacher assoziativer Container" ist

Dies bedeutet, dass sie genau gleich sind. Der Unterschied besteht darin, dass die Karte Paare von Elementen (Schlüssel / Wert) und nicht nur einen Wert enthält.

    
Martin York 13.09.2010 21:02
quelle
1

Eine Map wird oft als assoziatives Array bezeichnet, das normalerweise unter Verwendung eines binären Baums (zum Beispiel) implementiert wird. Eine Deque ist eine doppelendige Warteschlange, eine bestimmte Inkarnation einer verknüpften Liste.

Das bedeutet nicht, dass die tatsächlichen Implementierungen der Container-Bibliothek diese Konzepte verwenden - die container-Bibliothek gibt Ihnen nur einige Garantien darüber, wie Sie auf den Container zugreifen können und zu welchen (amortisierten) Kosten.

Ich schlage vor, Sie werfen einen Blick auf eine Referenz, die detailliert auf die Garantien eingeht. Scott Meyers Buch "Effective STL: 50 spezifische Möglichkeiten, um Ihre Verwendung der Standard-Template-Bibliothek zu verbessern" sollte ein wenig über diese sprechen, wenn ich mich richtig erinnere. Abgesehen davon ist der C ++ - Standard natürlich eine gute Wahl.

Was ich wirklich sagen möchte ist, dass Container wirklich durch ihre Eigenschaften und nicht durch die zugrunde liegende Implementierung beschrieben werden.

    
Jim Brissom 13.09.2010 20:50
quelle
1

set: enthält eindeutige Werte. Setze 'a' zweimal ein, das Set hat ein 'a'. Karte: ordnet Schlüsseln Werten zu, z. 'Name' = & gt; "Fred", "Alter" = & gt; 40. Sie können nach 'Name' suchen und Sie erhalten 'fred' heraus.

wird aus der Warteschlange entfernt, wie ein Vektor, aber Sie können nur an den Enden hinzufügen / entfernen. Keine Einsätze in der Mitte. Ссылка

edit: Meine Dequeue-Beschreibung fehlt, siehe Kommentare unten für Korrekturen

    
Graham Perks 13.09.2010 20:49
quelle

Tags und Links