2010-01-08 2 views
5

Ich versuche, den gleichen Schlüssel mehrmals in Karte einzufügen, aber mit anderen Werten. Es funktioniert nicht. Ich weiß, dass der Operator [] diese Aufgabe erledigt, aber meine Frage ist, ob dieses Verhalten der Einfügung korrekt ist. Sollten Sie keine Inserts() einfügen? Ich frage mich, was Standard sagt. Leider habe ich es nicht (Standard für C++) also kann ich das nicht überprüfen.
Vielen Dank für hilfreiche Ansers.Warum einfügen von Std :: Map nicht aktualisieren? [C++]

Antwort

14

Wenn Sie den gleichen Schlüssel mit unterschiedlichen Werten einfügen möchten , benötigen Sie stattdessen std::multimap.

Die std::map::insert wird nichts tun, wenn der Schlüssel bereits existiert. Der std::map::operator[] überschreibt den alten Wert.

Für STL-Referenz benötigen Sie nicht den C++ - Standard selbst; etwas wie http://www.cplusplus.com/reference/ wird auch tun.

+0

Danke. Und weil ich mindestens 15 Char haben muss, tippe ich diesen Text. –

5

Ich bin mir nicht sicher, ob ich vollständig verstehe, aber es klingt wie Sie Ihre vorherigen Einträge in der Karte überschreiben; A map speichert nur einen Wert pro Schlüssel.

Stattdessen müssten Sie multi_map verwenden. Dadurch können Sie denselben Schlüssel mit anderen Werten einfügen. Sie verlieren operator[] auf diese Weise, da es keinen Sinn ergeben würde. (. Wenn Sie sicher, Einfügen, aber das Operator nimmt auch, welcher Wert sollte es wieder?)

Hier ist ein Beispiel (modifiziert nach here):

#include <iostream> 
#include <map> 

int main(void) 
{ 
    std::multimap<std::string, int> m; 

    m.insert(std::make_pair("a", 1)); 
    m.insert(std::make_pair("b", 2)); 
    m.insert(std::make_pair("c", 3)); 
    m.insert(std::make_pair("a", 4)); 
    m.insert(std::make_pair("b", 5)); 
    m.insert(std::make_pair("a", 6)); 

    std::cout << "Number of elements with key a: " << m.count("a") << endl; 
    std::cout << "Number of elements with key b: " << m.count("b") << endl; 
    std::cout << "Number of elements with key c: " << m.count("c") << endl; 

    std::cout << "Elements in m: " << endl; 
    for (m::iterator it = m.begin(); it != m.end(); ++it) 
    { 
     std::cout << " [" << it->first << ", " << it->second << "]" << endl; 
    } 
}