operator= und insert bei std::map



  • Hallo.
    Kurze Frage: Tut folgender Code genau das selbe, oder gibt es einen Unterschied?

    // eins
    this->m_mapConstants.insert(std::pair<char*, int>(pszName, iValue));
    
    // zwei
    this->m_mapConstants[pszName] = iValue;
    

    Gruß



  • theliquidwave schrieb:

    Hallo.
    Kurze Frage: Tut folgender Code genau das selbe, oder gibt es einen Unterschied?

    // eins
    this->m_mapConstants.insert(std::pair<char*, int>(pszName, iValue));
    
    // zwei
    this->m_mapConstants[pszName] = iValue;
    

    Nein.

    Das erste erstellt eine Kopie des Paares in der Map, falls der Schlüssel noch nicht vorhanden war. Falls der Schlüssel schon in der Map war, passiert nichts.

    Das zweite verändert/fügt_hinzu das Paar in der Map auf jeden Fall. Wenn der Schlüssel noch nicht vorhanden war, wird ein entsprechendes Paar angelegt, wobei pair.second Default-konstruiert. Dein iValue wird über op= an pair.second übergeben.

    btw: char* als Schlüssel ist ganz großer Käse. Wenn Du einen Comparator benutzt, der die Strings vergleicht, kannst Du die Map durcheinanderbringen, indem Du die Strings veränderst. Das ist möglich, weil Du die Strings nicht direkt speicherst, sondern nur über die Zeiger. Nimm doch einfach std::string!



  • zwei ist scheiße, weils viel zu oft den constructor aufruft



  • und schrieb:

    zwei ist scheiße, weils viel zu oft den constructor aufruft

    Welchen ctor... 😕



  • Ok, danke.
    Die char* werden nicht verändert, sie sind konstant.

    Gruß



  • theliquidwave schrieb:

    Ok, danke.
    Die char* werden nicht verändert, sie sind konstant.

    Gruß

    Dann mach sie wenigstens konstant oder benutze, wie Sebastian bereits sagt einen konstanten std::string .



  • Ok, das mit dem Konstant sehe ich ein. Aber nicht mit std::string, das wäre sinnlos weil ich nirgendwo in meinem Programm mit std::string Arbeite, die unnötige Herumkonvertiererei würde nichts bringen.

    Ich habe gerade noch eine Frage: Wann genau wird der Iterator ungültig? Kann man den Iterator nach einem Aufruf von erase() noch benutzen?

    Löscht folgender Code sämtliche Daten? Ich hoffe ja sonst habe ich das mit den Iteratoren wohl immer noch nicht ganz verstanden.

    std::map<char*, Signature_s*, CmpStr>::iterator it = this->m_mapSignatures.find(pszName);
    
    if (!bShared && it != this->m_mapSignatures.end())
    {
    	delete[] it->first; // der char* als Key
    	delete[] it->second->m_pszSignature; // ein char* im Struct
    	delete it->second; // der Struct selber (Signature_s*)
    
    	this->m_mapSignatures.erase(it);
    }
    

    Gruß





  • Hi.
    Ich kenne den Beitrag, danke. Habe ihn auch gerade noch einmal durchgelesen, jedoch erklärt er mir nicht, wann ein Iterator ungültig wird. Im Beitrag steht geschrieben, dass std::map new und delete standardmäßig verwendet. Ich muss doch trotzdem die Daten des Iterators selber löschen oder nicht?

    Gruß



  • theliquidwave schrieb:

    Habe ihn auch gerade noch einmal durchgelesen, jedoch erklärt er mir nicht, wann ein Iterator ungültig wird.

    Wirf mal einen Blick auf die Tabelle am Schluss...



  • Ach so. Stimmt. Dennoch muss ich aber it->second->m_pszSignature trotzdem manuell löschen oder? Oder ich baue einen Dekonstruktor der die Signatur löscht. Ist im Endeffekt das gleiche, oder?

    Gruß


Anmelden zum Antworten