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.


Anmelden zum Antworten