Referenz auf map
-
Hallo,
ich habe ein assoziatives Array mittels map angelegt und eine Referenz darauf:
map<char*, char*> g; map<char*, char*> &ref_map = g;Folgender Code
ref_map["test1"] = "bla"; cout << "size: " << g.size() << endl; if (g.find("test1")==0) cout << "test1: " << g["test1"] << endl; else cout << "test1 wurde nicht gefunden!" << endl; ref_map["test2"] = "blubb"; cout << "size: " << g.size() << endl; if (g.find("test2")==0) cout << "test2: " << g["test2"] << endl; else cout << "test2 nicht gefunden!"<<endl;liefert mir dann folgende Ausgabe:
size: 1
test1 wurde nicht gefunden!
size: 2
test2 wurde nicht gefunden!Und nun frage ich mich natürlich warum er die Stellen nicht findet, obwohl er die richtige Größe und damit die Einträge scheinbar angelegt hat.
mfg chuqa
-
Das liegt nicht an der Referenz, sondern an deinem Vergleichskriterium - Pointer-Vergleiche betreffen die verwendeten Adressen und die Adressen zweier String-Literale sind idR verschieden.
(als Lösung könntest du statt der char* std::string verwenden, die vergleichen den Inhalt ihres Speichers - oder du definierst einen eigenen Funktor, der char*'s per strcmp() vergleicht)
-
außerdem liefert std:
:find iterator zurück
-
Was mir selber erst auffiel als ich das Beispiel mal mit und ohne String-Pooling ausprobieren wollte:
Das liegt zunächst primär erstmal daran, dass Null kein gültiger Iterator von der Map ist und deshalb der Vergleich g.find(...)==0 undefiniert ist.
-
Jo stimmt den Rückgabewert von find hab ich nicht beachtet. Mit
if (g.find("test")==g.end()) { /* nicht erfolgreich */ ... }funktioniert das ganze dann. Danke
mfg chuqa
-
Bist Du immernoch bei char*? Wenn ja: Wieso ignorierst Du CStoll? Das funktioniert nur weil Du Glück hast.
-
Nein nein, ich ignorier doch nicht jemand, der versucht mir hier zu helfen.
Bin nicht mehr bei char*. Hab das auf map<string, string> geändert.
Danke nochmals.mfg chuqa.