Wie Wert in Map einfügen?



  • Abend,

    ich habe folgende Map:

    std::map<std::string, std::pair<uint, Vector4>> mymap
    

    Wie füge ich da jetzt am effizientesten einen Wert ein?

    Per insert

    mymap.insert ( pair<string, pair<uint, Vector4>>("hallo", pair<uint, Vector4(3, myvec) );
    

    oder per operator[]

    mymap["hallo"] = pair<uint, Vector4>(3, myvec);
    

    ? Was is besser/schneller?

    PS: Wäre mein insert() Aufruf überhaupt korrekt?



  • Wie wärs mit:

    map[key] = std::make_pair(first, second);
    

    😉



  • http://cplusplus.com/reference/stl/map/

    Die Lösung mit Operator[] ist leichter lesbar, gleich schnell oder langsamer (vermutlich wird aber optimiert, sodass beide Lösungen gleich schnell sind). Du kannst es ja mal ausprobieren. Ich vermute, dass dein insert()-Aufruf falsch ist, du kannst ja mal unter dem Link nachschauen.



  • Also, erstmal ist das:

    std::map<std::string, std::pair<uint, Vector4>> mymap
    

    falsch.richtig:

    ...r4> >...mymap
    

    Zweitens gleicht die Map im Insert Versuch nicht der ersten.
    so ist's recht (?):

    mymap.insert("hallo",pair<uint, Vector4>(3, myvec) );
    

    Und drittens...
    ist das erzeugen eines Elementes in einer Map mit dem Indexoperator nur ein Ausnahme des Compilers, um im Falle eines nicht-vorhanden sein des Schlüssels, der bei der Indentifizierung des Elements genommen wurde, ein mit diesem Schlüssel indentifizierbares, also neues Element zu erstellen.

    mymap["hallo"]=pair<uint, Vector4>(3, myvec);
    

    Soweit ich weiß ist das einfügen mit der index-funktion schneller,
    also effizienter, oder wie immer du es nennen magst.
    Außerdem bekommt es noch einen Pluspunkt, weil es besser lesbar ist (finde ich).



  • Dürfte beides gleich schnell sein. Der Unterschied ist, dass du bei operator[] nicht mehr feststellen kannst, ob du jetzt einen neuen Wert erzeugt oder einen alten überschrieben hast.



  • Der op[] muß ein Element mit dem Default-Konstruktor erzeugen, dessen Referenz zurückgeben und dann erst darf man mit dem op= dem was zuweisen.
    Insert kann direkt den Kopierkonstruktor benutzen.
    Also ist insert schneller.
    Außer, der Optimierer ist schlau genug und macht sie gleich schnell.



  • falsch.richtig:

    Ist nicht zwingend falsch, benutzt doch eh fast jeder Hobbycoder schon C++0x features. 😉


  • Mod

    Außerdem kann insert eventuell gleich von oben nach unten die hinter der Map stehende Baumstruktur zum Zielort durchgehen dabei gleich den Baum neu balancieren. Operator[] wird erst einmal suchen (da er davon ausgeht, dass es das Element schon gibt) und im Nichterfolgsfall muss der Baum von der Einfügestelle wieder nach oben durchgegangen und neu balanciert werden.


Log in to reply