Vektor mit Pointern kopieren



  • Hallo,

    wenn ich einen Vektor mit Pointern kopieren will (sagen wir mal der enthält immer so 200-600 Elemente), lohnt es sich dann "reserve" beim Zielvektor aufzurufen?

    Beispiel:

    Zielvektor enthält 201 Pointer. In einem anderen Vektor sind 403 Elemente.
    Jetzt mache ich folgendes:

    std::vector<X*>::iterator itB = m_A.begin();
    std::vector<X*>::iterator itE = m_A.end();
    
    m_B.reserve( m_B.size() + m_A.size() ); // Hier
    
    while(itB != itE)
    {
       m_B.push_back( new X( *(*itB) ) );  
       ++itB;
    }
    

    Bringt das Geschwindigkeitsvorteile?



  • Kannst du doch ganz einfach messen. Ich hab derartige Messungen zwar noch nie gemacht ( nicht im Bezug auf reserve ) aber ich denke, es macht kaum einen Unterschied, da es sich nur um Pointer handelt und deine Datenmenge auch nicht besonders groß ist.
    Würdest du 1 Mio Pointer halten wollen, wäre das vielleicht was anderes.

    Sind aber nur Vermutungen. Eine Messung wird dir da eher weiterhelfen.



  • CLIC schrieb:

    std::vector<X*>::iterator itB = m_A.begin();
    std::vector<X*>::iterator itE = m_A.end();
    m_B.reserve( m_B.size() + m_A.size() ); // Hier
    while(itB != itE)
    {
       m_B.push_back( new X( *(*itB) ) );  
       ++itB;
    }
    

    Bevorzuge Elementfunktionen des Containers, die das tun, was Du willst:

    m_B.insert(m_B.end(), itB,irE);
    

    Eine gute Implementierung von vector<>::insert berechnet die Länge der Sequenz [itB,itE) und reserviert genügend Speicher, falls die Iteratoren itB und itE RandomAccessIteratoren sind.



  • Sebastian Pizer schrieb:

    Bevorzuge Elementfunktionen des Containers, die das tun, was Du willst:

    m_B.insert(m_B.end(), itB,irE);
    

    Eine gute Implementierung von vector<>::insert berechnet die Länge der Sequenz [itB,itE) und reserviert genügend Speicher, falls die Iteratoren itB und itE RandomAccessIteratoren sind.

    Aber so werden ja nur die Pointer kopiert und nicht die Objekte, richtig?


  • Mod

    CLIC schrieb:

    Sebastian Pizer schrieb:

    Bevorzuge Elementfunktionen des Containers, die das tun, was Du willst:

    m_B.insert(m_B.end(), itB,irE);
    

    Eine gute Implementierung von vector<>::insert berechnet die Länge der Sequenz [itB,itE) und reserviert genügend Speicher, falls die Iteratoren itB und itE RandomAccessIteratoren sind.

    Aber so werden ja nur die Pointer kopiert und nicht die Objekte, richtig?

    Ja. Hast du etwas anderes vor? Das ging aus deinen anderen Beiträgen nicht hervor.



  • SeppJ schrieb:

    CLIC schrieb:

    Sebastian Pizer schrieb:

    Bevorzuge Elementfunktionen des Containers, die das tun, was Du willst:

    m_B.insert(m_B.end(), itB,irE);
    

    Eine gute Implementierung von vector<>::insert berechnet die Länge der Sequenz [itB,itE) und reserviert genügend Speicher, falls die Iteratoren itB und itE RandomAccessIteratoren sind.

    Aber so werden ja nur die Pointer kopiert und nicht die Objekte, richtig?

    Ja. Hast du etwas anderes vor? Das ging aus deinen anderen Beiträgen nicht hervor.

    Wieso ging das aus

    m_B.push_back( new X( *(*itB) ) );
    

    Nicht hervor?



  • Ja ok, nach zweimaligen lesen wohl unklar, geb ich zu.


  • Mod

    Ok, dann gibt es natürlich auch dafür Lösungen (zum Beispiel das was du schon gmeacht hast). Jedoch: Warum hast du einen Vector mit Zeigern auf Elemente die alle vom gleichen Typ sind? Warum speicherst du sie nicht gleich im Vector?



  • CLIC schrieb:

    Aber so werden ja nur die Pointer kopiert und nicht die Objekte, richtig?

    Richtig. Ich hatte nicht genau hingeguckt, was Du mit den Zeigern anstellst. Sorry!

    SeppJ schrieb:

    Warum hast du einen Vector mit Zeigern auf Elemente die alle vom gleichen Typ sind? Warum speicherst du sie nicht gleich im Vector?

    @CLIC: Das ist eine gute Frage von SeppJ. Es sieht nicht so aus, als ob Du die Zeiger an dieser Stelle wirklich brauchst. Sie machen nur die Verwaltung der Lebenszeit der Objekte kompliziert. Du hast das dann auch nicht richtig gekapselt. Nimm std::vector ohne Zeiger oder boost::ptr_vector. 😉

    Gruß,
    SP


Log in to reply