Ist es in STL-Maps besser, map :: insert als [] zu verwenden?
Vor einer Weile, ich hatte eine Diskussion mit einem Kollegen darüber, wie Sie zum einfügen von Werten in STL Karten. Ich bevorzugte
map[key] = value;
denn es fühlt sich natürlich und ist deutlich zu Lesen, während er am günstigsten gelegene
map.insert(std::make_pair(key, value))
Ich ihn einfach gefragt und keiner von uns kann sich daran erinnern, warum legen Sie besser ist, aber ich bin sicher, es war nicht nur eine Stil-Präferenz-eher gab es einen technischen Grund, wie Effizienz. Die Die SGI-STL-Referenz einfach sagt "Streng genommen, diese member-Funktion ist unnötig: es existiert nur für die Bequemlichkeit."
Kann mir jemand sagen, der Grund, oder bin ich nur träumen, dass es eine gibt?
InformationsquelleAutor der Frage danio | 2008-11-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim schreiben
gibt es keine Möglichkeit zu sagen, wenn Sie ersetzt die
value
fürkey
oder wenn Sie erstellt eine neuekey
mitvalue
.map::insert()
wird nur:Für die meisten meiner apps, die ich in der Regel don ' T care wenn ich mich anlegen oder ersetzen, damit ich den leichter zu Lesen
map[key] = value
.InformationsquelleAutor der Antwort netjeff
Die beiden unterschiedlichen Semantik, wenn es um den Schlüssel, die bereits in der Karte. Sie sind also nicht wirklich direkt vergleichbar.
Aber der operator [] - version erfordert eine Standard-Konstruktion den Wert, und dann zuweisen, so ist dies teurer, dann kopieren Sie den Bau, dann wird es teurer. Manchmal Standard-Konstruktion macht das keinen Sinn, und dann wäre es unmöglich, mit dem operator[] version.
InformationsquelleAutor der Antwort Greg Rogers
Andere Sache zu beachten, mit
std::map
:myMap[nonExistingKey];
erstellen Sie einen neuen Eintrag in die Karte kodiert, umnonExistingKey
initialisiert, um einen default-Wert.Diese Angst die Hölle aus mir, das erste mal ich es sah (während schlug meinen Kopf gegen eine nastly legacy-bug). Hätte nicht erwartet, dass es. Mir, das sieht aus wie eine get-operation, und ich hatte nicht erwartet, dass die "side-Effekt"." Lieber
map.find()
wenn immer von Ihrer Karte.InformationsquelleAutor der Antwort Hawkeye Parker
Wenn die Leistung Treffer der default-Konstruktor ist nicht ein Problem, die bitte, für die Liebe Gottes, mit der besser lesbaren version.
🙂
InformationsquelleAutor der Antwort Torlack
Wenn Ihre Anwendung ist Geschwindigkeit entscheidend ich berate Sie mithilfe der [] - operator, denn es sorgt insgesamt 3 Kopien des ursprünglichen Objekts aus, die 2 sind temporäre Objekte und früher oder später zerstört.
Aber in der insert(), 4 Kopien des original-Objekts erstellt werden, aus denen 3 sind temporäre Objekte( nicht unbedingt "Provisorien") und werden zerstört.
Was bedeutet, dass Sie zusätzliche Zeit für die:
1. Eines objects memory allocation
2. Eine extra-Konstruktor aufrufen
3. Eine zusätzliche Destruktor-Aufruf
4. Eine Objekte-memory-deallocation -
Wenn Ihre Objekte groß sind, Konstruktoren sind typische, Destruktoren tun eine Menge von Ressourcen freigeben, die oben genannten Punkte zählen sogar noch mehr. In Bezug auf die Lesbarkeit, ich denke, beide sind fair genug.
Die gleiche Frage kam mir in den Sinn, nicht aber über Lesbarkeit, sondern die Geschwindigkeit.
Hier ist ein Beispiel-code, durch die ich kam, zu wissen, über den Punkt, den ich erwähnte.
InformationsquelleAutor der Antwort Rampal Chaudhary
insert
ist besser aus den Punkt der exception-Sicherheit.Den Ausdruck
map[key] = value
ist eigentlich zwei Vorgänge:map[key]
- erstellen einer map-element mit default-Wert.= value
- kopieren Sie den Wert in diesem element.Kann eine Ausnahme erfolgen im zweiten Schritt. Als Ergebnis der operation wird nur teilweise getan (ein neues element wurde Hinzugefügt, in die Karte, aber das element wurde nicht initialisiert, mit
value
). Die situation, wenn ein Vorgang nicht abgeschlossen, aber das system state geändert wird, wird als der Betrieb mit "Nebenwirkung".insert
operation gibt eine starke Garantie, das heißt Sie haben keine Nebenwirkungen (https://en.wikipedia.org/wiki/Exception_safety).insert
ist entweder vollständig durchgeführt oder es verlässt die Karte in einem unveränderten Zustand.http://www.cplusplus.com/reference/map/map/insert/:
InformationsquelleAutor der Antwort anton_rh
Jetzt in c++11 ich denke, dass der beste Weg, um fügen Sie ein paar in einer STL-map ist:
Den Ergebnis wird ein paar mit:
Element mit dem Ergebnis.zuerst), weist auf das paar eingefügt oder
das paar mit diesem Schlüssel, falls der Schlüssel bereits vorhanden ist.
Zweite element (Ergebnis.Sekunde), true, wenn das einfügen war richtig oder
falsch es ging etwas schief.
PS: Wenn Sie nicht über die Bestellung, die Sie verwenden können, std::unordered_map 😉
Dank!
InformationsquelleAutor der Antwort GutiMac
Einer gotcha mit map::insert() ist, dass es nicht ersetzen Sie einen Wert ein, wenn der Schlüssel bereits in der Zuordnung vorhanden ist. Ich habe gesehen, C++ geschriebenen code durch Java-Programmierer, wo Sie erwartet haben, dass insert() auf die gleiche Weise Verhalten wie die Karte.put() in Java, in denen Werte ersetzt werden.
InformationsquelleAutor der Antwort Anthony Cramp
Einer Hinweis ist, dass können Sie auch Boost.Zuweisen:
InformationsquelleAutor der Antwort rlbond
Hier ist ein weiteres Beispiel, die zeigen, dass
operator[]
überschreibt den Wert für den Schlüssel, wenn es vorhanden ist, aber.insert
nicht überschreiben den Wert, wenn es vorhanden ist.InformationsquelleAutor der Antwort bobobobo
Ist eher ein Fall beschränkt, sondern ausgehend von den Kommentaren, die ich erhalten habe finde ich es erwähnenswert.
Ich habe Menschen gesehen, die in der Vergangenheit Verwendung von Karten in der form von
auszuweichen Fällen des zufälligen Wert überschrieben, aber dann gehen Sie vor schreiben-in einigen anderen bits von code:
Ihren Grund, dies zu tun, wie ich mich erinnere, war, denn Sie waren sicher, dass in diesen bestimmte Codezeilen, die Sie waren nicht zu werden, überschreiben Werte anzeigen; daher geht es weiter mit den mehr 'lesbar' Methode
[]
.Ich habe eigentlich nie hatte keine direkten Probleme aus dem code, der geschrieben wurde, von diesen Leuten, aber ich fühle mich bis heute, dass die Risiken - so klein - sollte nicht eingenommen werden, wenn Sie leicht vermieden werden kann.
In Fällen, In denen Sie den Umgang mit Karte Werte, die müssen absolut nicht überschrieben werden, verwenden Sie
insert
. Mache keine Ausnahmen, lediglich zur besseren Lesbarkeit.InformationsquelleAutor der Antwort dk123
Die Tatsache, dass std::map
insert()
- Funktion nicht überschreiben, die dem Schlüssel zugeordnete Wert erlaubt uns zu schreiben-Objekt enumeration code wie folgt:Es ist ein ziemlich häufiges problem, wenn wir brauchen, um die Karte verschiedene nicht-eindeutigen Objekten, um einige id ' s im Bereich 0..N. Diese id kann später verwendet werden, zum Beispiel in graph-algorithmen. Alternative mit
operator[]
Aussehen würde, weniger lesbar, meiner Meinung nach:InformationsquelleAutor der Antwort mechatroner