direkt in std::vector kopieren...



  • Dumme Frage:

    mal angenommen ich verwende einen std::vector, um darin meine Sachen zu speichern (in meinem Fall Instanzen einer eigenen Klasse), gibt es dann eine Moeglichkeit, diese DIREKT in den Vector zu schreiben..... ehm.... ich sags mal so:

    std::vector<MyClass> MyExample;
        MyExample.push_back( MyClass(666, "foo")) ); // Kopiere neue Instanz in den vector
    

    d.h. im Vector wird ja immer nur eine Kopie angelegt, also wird im oberen Beispiel zuerst ein normaler Ctor und danach noch ein Copy-Ctor (fuer die Kopie in den Vektor) aufgerufen... gibt es eine Moeglichkeit, mir diesen einen Kopieraufruf zu sparen?

    Ich hatte mir schon ueberlegt, im vector nur Pointer auf Objekte abzulegen, und mich selber um die Speicherverwaltung der Objekte zu kuemmern, aber... na jo, die Arbeit haett ich halt lieber auf den vector abgeschoben.... geht das irgendwie, oder nicht?



  • also eigentlich nicht (mit dem standard vektor)..
    das beste, dass ich dir bieten kann:

    #include <iostream>
    #include <vector>
    #include <memory>
    using namespace std;
    
    class X {};
    
    int main () {
    	vector<X> vx;
    	vx.reserve (100);
    
    	uninitialized_fill (&vx[0], &vx[100], X());
    
    	for (int i = 0; i < 100; ++i) { vx].~X(); }
    
            cout << vx.size() << endl;
    }
    

    Also erstens mal reserviere ich Speicher für mindestens 100 Xs. Nicht resize, denn resize mach elemente rein.
    dann darf ich denn vector nur noch eingeschränkt verwenden, weil er denkt, seine size == 0. und am ende muss ich mich noch selbst um den destruktor aufruf kümmern. nur den freispeicher gibt vector dann noch selbst frei.
    bevor ich so was verwendete, würde ich lieber eine alternative suchen...



  • Du kannst immer noch boost::shared_ptr<>s auf deine Klasse in einen Container tun. Das macht die Sache zwar etwas langsamer und auf den ersten Blick auch komplizierter, ist aber imho die einfachste Lösung. Es gibt schon Vorschläge für Spracherweiterungen, mit denen man das Problem so direkt und effizient wie möglich lösen könnte, aber dass die tatsächlich mal Teil des Standards werden, bezweifle ich 😕


Anmelden zum Antworten