2014-02-15 31 views
7

Ich bin relativ neu in C++ Programmierung und fragte mich, ob jemand helfen könnte, ein paar Fragen für mich zu klären.Was ist der Unterschied zwischen std :: set und std :: map

http://www.cplusplus.com/reference/set/set/

http://www.cplusplus.com/reference/map/map/

Ich habe gelesen, wie STL binäre Suchbäume zu implementieren und ich halte zu bemerken, dass std :: gesetzt und std :: map als die Methoden ständig erwähnt zur Durchführung solcher eine Aufgabe. Was genau ist der Unterschied zwischen den beiden? Für mich scheinen beide fast identisch zu sein, und ich bin mir nicht sicher, ob es etwas gibt, das ich nicht bemerke, das einen für bestimmte Aufgaben besser macht als den anderen. Gibt es einen Vorteil, std :: set über std :: map zu verwenden, um einen STL-binären Suchbaum zu implementieren, der Werte von einem Array oder Vektor (wie zum Beispiel Geschwindigkeit) akzeptiert?

Wenn jemand mir helfen könnte, dieses Konzept zu verstehen, würde ich es sehr schätzen!

+0

'set' speichert Elemente, einzigartige Elemente,' map' speichert ein 'Paar' bestehend aus' Schlüssel' + 'Wert'. – user2485710

+0

Ich sehe nicht, wie Sie sie verwenden könnten, um binäre Suchbäume zu implementieren. Die von ihnen spezifizierten Schnittstellen und Komplexitäten sind eine stärkere Abstraktion als binäre Suchbäume, und sie können in Bezug auf sie implementiert werden. – pmr

Antwort

6

Sowohl std::set als auch std::map sind associative containers. Der Unterschied besteht darin, dass std::sets nur den Schlüssel enthält,
während in std::map dort ein zugehöriges Wert ist, dass, wenn A -> B, dann map [A] = B, das funktioniert wie hashing aber nicht O(1) statt O(log N).

Sie können weiter sehen unordered_map, die den Betrieb in O(1) Zeit bietet.

std::set speichert Daten im sortierten Format.
Die Implementierung von beiden erfolgt durch ausgeglichene Bäume (wie AVL oder Rot-Schwarz-Bäume) geben O(logN) Zeit Komplexität.

Aber wichtig zu beachten ist, dass beide eindeutige Werte speichern können. Um das zu überwinden, müssen Sie auch multimap und multiset sehen.

Hoffe, das hilft!

Update: Im Fall von Rot-Schwarz-Baum Neugewichtung Rotation ist ein O(1) Betrieb während mit AVL ist dies ein O(log n) Betrieb, so dass der Rot-Schwarz-Baum effizienter in diesem Aspekte der Neugewichtung Bühne und einer der möglichen Gründe, dass es häufiger verwendet wird.

+0

Also sagen Sie zum Beispiel, ich habe ein Array oder Vektor, der nichts als Integer-Werte hat. Wenn ich all diese Werte in einer binären Suchstruktur speichern möchte, würde ein Set alles tun, was ich möchte, und es würde keine Karte benötigt werden. Nur versuchen, um sicherzustellen, dass ich richtig verstehe – Valrok

+0

genau! Aber Sie sollten wissen, dass diese integrierten Funktionen etwas langsam sind, als wenn Sie sie in "C" von Grund auf neu erstellen. –

+0

@Aseem Goyal Sie meinen, die typischen std-Bibliothek Implementierungen von std :: map, std :: unordered_map und so weiter sind langsamer als wenn Sie Ihren eigenen Container mit rohen C schreiben würden? – Zebrafish

Verwandte Themen