2016-04-11 7 views
0

Meine Karte ist wie folgt definiert:Löschtaste, Wert von Karte von Wert in C++

map<string, map<string, string>> _map; 

Aber das Problem, das gekommen ist, ist, dass meine Karte des erste ist meist der gleiche Wert, dh

_map["key1"]["value1"] = "data1"; 
_map["key1"]["value2"] = "data2"; 
_map["key1"]["value3"] = "data3"; 
_map["key1"]["value4"] = "data4"; 
_map["key2"]["value5"] = "data5"; 

Also, wenn ich möchte einen bestimmten (Schlüssel, Wert) löschen, ich kann nicht verwenden _map.find („key1“) für den Iterator, weil es doppelte Einträge hat.

Gibt es eine Möglichkeit, den Iterator-Index mithilfe des Werts festzulegen?

Angenommen, ich möchte diesen Eintrag löschen:

_map["key1"]["value4"] = "data4"; 

Wie würde ich das tun?

+0

Ihre Frage ist nicht klar. Anscheinend fragen Sie, wie Sie ein Element aus einer Map entfernen können, was in der Dokumentation trivial ist. Können Sie klären, was das Problem ist, das Sie lösen möchten? – juanchopanza

+0

Sie können nicht mehr als einen Wert pro Schlüssel in einer Karte haben. –

+0

@ A.Franzen: Er hat nicht mehr als einen Wert pro Schlüssel. Schau genau! – Nawaz

Antwort

2

Nawaz Antwort ist richtig. Es hat jedoch eine Schwäche: Wenn Sie "value5" löschen, enthält _map["key2"] immer noch eine leere map<string, string>. Dies ist wahrscheinlich nicht das, was Sie beabsichtigen.

Um dies zu beheben, können Sie die pair Vorlage verwenden und die Art der _map ändern zu sein: Sie können

_map[make_pair("key1", "value1")] = "data1"; 
_map[make_pair("key1", "value2")] = "data2"; 
_map[make_pair("key1", "value3")] = "data3"; 
_map[make_pair("key1", "value4")] = "data4"; 
_map[make_pair("key2", "value5")] = "data5"; 

Dann jeden Eintrag entfernen:

map<pair<string, string>, string> _map; 

Ihre Zuweisungen dann aussehen würde, wie:

_map.erase(make_pair("key1", "value4")); 

Sie können diefindengeben Sie den <utility> Header ein.

+0

Würden seine Daten immer noch in der gleichen Reihenfolge organisiert werden, anstatt sie zu initialisieren? Fragen, weil ich es wirklich nicht weiß. – Stephen

+0

Ja, würde es.'std :: pair' definiert einen Vergleich, der zuerst nach der ersten und dann nach der zweiten Koordinate sortiert. –

+0

Löschen gibt mir einen Fehler. Es erkennt den Parameter nicht. Ich kann es nicht so löschen. Ich habe versucht, ein konstantes Paar auch zu übergeben, funktioniert immer noch nicht. –

3

Gerade erase es:

_map["key1"].erase("value4"); 

Beachten Sie, dass es nicht Ausnahme nicht aus, wenn der Schlüssel nicht — existiert es gibt 0 zurück, in diesem Fall.

BTW, können Sie die Initialisierung der Karte als verbessern:

std::map<std::string, std::map<std::string, std::string>> _map 
{ 
    {"key1", { 
       {"value1", "data1"}, 
       {"value2", "data2"}, 
       {"value3", "data3"}, 
       {"value4", "data4"} 
      } 
    }, 
    {"key2", { 
       {"value5", "data5"} 
      } 
    } 
};