std::map und Ctor



  • Hallo,

    folgender Code:

    std::map<int, Foo> myMap;
    std::vector<int> vec;
    ...
    while(..) {
    
       Obj obj;
       ...
    
       if(...)
          myMap[id].addObject(obj);
    
    }
    

    Ich fülle also in der Schleife die Map. Das addObject kann beliebig oft für eine id (int) aufgerufen werden. Wenn das 1. Mal myMap[id] für eine id gemacht wird, die noch nicht in der Map gespeichert ist, dann wird ja implizit ein Foo Objekt angelegt.
    Mein Problem ist nun: Alle Foo-Objekte benötigen einen Zeiger auf den vector vec.
    Ich könnte jetzt natürlich das if einfach ändern in:

    if(...) {
          myMap[id].addObject(obj);
          myMap[id].setVec(&vec);
    }
    

    Aber das ist ja Verschwendung. Ich würde den vector Zeiger immer und immer wieder setzen, obwohl ichs nur einmal machen müsste. Eigentlich müsste ich den Zeiger im Foo Ctor übergeben, aber das geht bei dem Code hier ja nicht (Default-Ctor wird beim Map operator[] implizit aufgerufen)

    Wie mach ich das also, dass ich allen Foo Objekten in der Map einen Zeiger auf vector zuweise (aber nur EINMAL)?



  • Alle Map-Einträge schon vor der Schleife anlegen oder nach der Schleife erst den Zeiger auf den vector setzen.

    [Edit] Oder einfach mit der "Verschwendung" leben. Über wie viele ms reden wir hier?



  • lower_bound liefert dir einen iterator auf die Stelle an der das gesuchte Objekt sein sollte. Wenn es dort ist, kannst du einfach .addObject machen, wenn nicht kannst du insert und addObject machen und dem insert den iterator mitgeben um ein O(1) insert zu bekommen.



  • Michael E. schrieb:

    Alle Map-Einträge schon vor der Schleife anlegen oder nach der Schleife erst den Zeiger auf den vector setzen.

    [Edit] Oder einfach mit der "Verschwendung" leben. Über wie viele ms reden wir hier?

    Die Verschwendung ist aus Sicht der Performance egal. Ich fands einfach nur nicht so "schön". Ich geh nach der Schleife einfach über die Map und setz den Pointer.


Anmelden zum Antworten