[BCB 2007] vector<> (STL) Inhalt sichern



  • Hallo zusammen,

    in meinem aktuellen Projekt wird auf das vector<> Element der STL zurückgegriffen. In diesem vector<> werden momentan Strukturelemente verwaltet.

    typedef struct Beispiele
    {
    ...
    bool                      status;
    unsigned int              index;
    unsigned int              level;
    ...
    }
    
    vector<Beispiele1, Beispiele2, ... etc>
    

    Ich möchte nun eine Protokollierung einbauen, die es erlauben soll, Änderungen an Struktur-Parameterwerte nachvollziehen zu können. Soll heißen, dass wenn der Benutzer zur Laufzeit einen Wert der Struktur ändert, soll dieser in einem entsprechenden Protokoll zum alten Wert aufgeführt werden soll.

    Bsp:

    index_alt: 10
    index_neu: 15

    Ich stehe im Moment ein wenig auf dem Schlauch, wie ich eine Kopie bzw. eine Sicherung des vectors<> anlegen kann/muss. Momentan gehe ich so vor, dass ich die Elemente aus dem aktuellen vector<> in ein entsprechendes Struktur-Element kopiere und dann dem backup-vector<> zuweise.

    backupVector.clear();
    
    if(backupVector.empty())
    {
    	for (unsigned int i = 0; i < aktuellerVector.size(); i++)
    	{
    		Utils::Strukturelement i_entry = aktuellerVector[i];
    		backupVector.push_back(i_entry);
    	}
    }
    

    Beim Änderungsvergleich allerdings, hat der backup-vector<> die gleichen Werte wie der aktuelle vector<>, obwohl sich Werte geändert haben. Der backup-vector<> aktualisiert sich sozusagen gleich mit, wenn sich ein wert ändert, obwohl programmtechnisch keine Zuweisung stattfindet!

    Ich erkläre es mir so, dass der vector<> nur die Speicheradressen verwaltet, in denen die Strukturelemente sich befinden. Damit zeigt sowohl der aktuelle als auch der backup-vector<> auf die gleichen Strukturelemente!! Ist das korrekt?

    Nun meine Frage. Wie kann ich dies richtig realisieren? Wie kann ich eine Sicherung eines Vectors anlegen, der nach dem kopieren losgelöst vom aktuellen Vector ist und der nicht bei Änderungen mitaktualisiert wird?!?!

    Vielen Dank für eure Antworten
    Gruß



  • Hi,
    Ist denn Utils::Strukturelement ein Pointer? Vllt solltest Du mehr Code zeigen da

    vector<Beispiele1, Beispiele2, ... etc>
    

    noch auf andere Problem zeigt.



  • Willst du wirklich immer den ganzen vector sichern, wenn nur ein Element geändert wurde? Reicht es nicht das geänderte Element zu sichern? Das ganze ist doch sowas wie eine Undo-Liste.
    Zu deinem Problem. push_back kopiert in den vector. Es kann also eigentlich nicht sein, das dein Backupvector sich mitsichert. Ich vermute mal, das du die Sicherung am falschen Ort und zu oft ausführst.
    Deine ganzen Zeilen lassen sich auch ein wenig zusammenfassen.

    backupVector.clear();
    std::copy(aktuellerVector.begin(), aktuellerVector.end(), std::back_inserter(backupVector));
    


  • Danke schon mal für eure Antworten.

    Ich rufe meine Funktion zum Sichern des Vectors genau einmal auf! Es wird gewünscht, dass die Protokollierung der Änderungen (bei vielen Parameterwerten) einmal stattfinden soll und zwar dann, wenn der Benutzer auf Speichern klickt.

    Nach dem Speichern erstelle ich die Kopie des Vectors, um beim nächsten Speichern wieder ein Referenz-Vector zu haben. Ich habe versucht, die copy-Funktion anstelle meiner Lösung zu benutzen. Leider mit dem gleichen Effekt wie vorher!

    Ich brauche in dem backup-vector unabhängige Objekte, die alle Werte des aktuellen Vectors zum Zeitpunkt des letzten Speicherns beinhaltet. Zur Zeit sieht es so aus, dass die Objekte im backup-vector nicht unabhängig sind, sondern nur ein Verweis auf eine Speicheradresse.



  • Dann will ich wittes Frage wiederholen. Speicherst du evtl. Zeiger auf deine Objekte im vector? Wie sieht denn die Deklaration aus?
    Noch mal push_back kopiert auf jeden Fall die Elemente in den vector. Referenzen sind da nicht möglich, lediglich Zeiger.



  • Hallo

    Ich erkläre es mir so, dass der vector<> nur die Speicheradressen verwaltet, in denen die Strukturelemente sich befinden. Damit zeigt sowohl der aktuelle als auch der backup-vector<> auf die gleichen Strukturelemente!! Ist das korrekt?

    vector verwaltet und kopiert seine Elemente. Wenn du einen vector von Zeigern hast (std::vector<MyStruct>*) dann werden in der Tat nur die Adressen kopiert. Hast du aber einen vector von Instanzen (std::vector<MyStruct>) dann werden die Elemente selber kopiert. Der Zielvector erstellt neue Instanzen. Und um einen ganzen vector mit allen Elementen zu kopieren brauchst du eigentlich weder eine Schleife noch std::copy, eine Zuweisung reicht aus :

    vector_neu = vector_alt;
    

    bis bald
    akari



  • wenn du jedoch mit std::vector<MyStruct*> arbeitest dann geht es auch so:

    template<class T>
    void clone_vector(const std::vector<T> &source, std::vector<T> &target)
    {
       for(std::vector<T>::const_iterator it = source.begin(); it != source.end();++it)
       {
          target.push_back(new T(*it)); 
       }
    }
    

    vorausgesetzt das deine struktur einen copy-ctor besitzt.
    und beim zerstoeren von target muessen die angelegten objekte auch wieder geloescht werden.


Anmelden zum Antworten