Iteratoren in Vector speichern



  • Hallo,

    folgendes Problem.
    Ich habe zwei Vectoren. Der eine beinhaltet die eigentlichen Elemente (a), der andere beinhaltet nur den Iterator (ai).
    Nun möchte ich Elemente aus dem Vector (a) löschen und dadurch erreichen, dass das Element in ai auch "weg" ist.

    Es ist so gedacht, dass ich später sehr viele Vectoren (wie ai) habe und durch das Löschen des jeweiligen Elements in Vector a
    automatisch die Elemente in ai "weg" sind.

    Ich wollte bei der späteren Ausgabe dann Vector ai ausgeben, indem ich Schritt für Schritt checke, ob das Elemnt hinter dem Iterator noch existiert.
    Aber es kommt schon ein Fehler wenn ich nur Versuche den Vector durchzulaufen.

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main () {
    
      vector<int> a;
      a.push_back(5);
      a.push_back(10);
      a.push_back(15);
      a.push_back(20);
      a.push_back(25);
      a.push_back(30);
      a.push_back(35);
    
      vector<vector<int>::iterator> ai;
    
      for(vector<int>::iterator iter=a.begin(); iter < a.end(); ++iter) {
        ai.push_back(iter);
      }
    
      a.erase(a.begin()+3);
    
      for(vector<vector<int>::iterator>::iterator iter=ai.begin(); iter < ai.end();) {
    	  cout << **iter << " ";
      }
    
      return 0;
    }
    

    Kann ich es, bzw ist es überhaupt Sinnvoll es so zu lösen?
    Ich würde mich sehr freuen, wenn mir jemand helfen würde.

    Viele Grüße,
    Samuirai





  • Samuirai schrieb:

    Ich habe zwei Vectoren. Der eine beinhaltet die eigentlichen Elemente (a), der andere beinhaltet nur den Iterator (ai).

    Dann hast Du Dein Programm falsch abgetippt. Ich sehe da zwei Vektoren vom Typ vector<int>.

    Lies Dir die Garantien durch, die versch. Container bzgl Validität von Iteratoren machen. Vielleicht kannst Du auch std::list gebrauchen.

    Samuirai schrieb:

    a.erase(a.end());
    

    a.end() zeigt auf kein gültiges Element. Das tut es nie.



  • Vielen Dank für die schnellen Antworten.
    Mit copy erhalte ich leider nicht das Ergebnis das ich benötige.
    Siehe hier:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main () {
    
      vector<int> a; 
      a.push_back(5);
      a.push_back(10);
      a.push_back(15);
      a.push_back(20);
      a.push_back(25);
    
      vector<int> a1;
      a1.resize(5);
    
      copy(a.begin(),a.end(),a1.begin());
    
      a.erase(a.begin());
    
      for(vector<int>::iterator iter=a1.begin(); iter < a1.end(); ++iter) {
    	cout << *iter << ",";
      }
    
    cin.get();
    cin.get();
    
      return 0;
    }
    

    Ich hab das falsche kopiert, tut mir leid.
    Hier das Richtige (ich editiers auch nochmal im Erstpost)

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main () {
    
      vector<int> a;
      a.push_back(5);
      a.push_back(10);
      a.push_back(15);
      a.push_back(20);
      a.push_back(25);
      a.push_back(30);
      a.push_back(35);
    
      vector<vector<int>::iterator> ai;
    
      for(vector<int>::iterator iter=a.begin(); iter < a.end(); ++iter) {
        ai.push_back(iter);
      }
    
      a.erase(a.begin()+3);
    
      for(vector<vector<int>::iterator>::iterator iter=ai.begin(); iter < ai.end();) {
    	  cout << **iter << " ";
      }
    
      return 0;
    }
    

    Das klappt auch so weit, ich muss nur irgendwie überprüfen ob **iter existiert oder nicht. Bisjetzt kommt dort der Fehler.

    Viele Grüße



  • Samuirai schrieb:

    Das klappt auch so weit, ich muss nur irgendwie überprüfen ob **iter existiert oder nicht. Bis jetzt kommt dort der Fehler.

    Ich sagte doch, schau Dir die Garantien an, die Container machen oder nicht machen. Beim erase des vector s werden alle Iteratoren, die auf das zu löschende Element oder dahinter zeigen, nach dem erase ungültig. So einfach ist das. Solltest Du alles mal nachlesen. Wer lesen kann ist klar im Vorteil.



  • Ich hab es jetzt anders gelöst:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main () {
    
      vector<int> a;
      a.push_back(1);
      a.push_back(2);
      a.push_back(3);
      a.push_back(4);
      a.push_back(5);
      a.push_back(6);
      a.push_back(7);
      a.push_back(8);
      a.push_back(9);
      a.push_back(10);
    
      vector<int*> ai;
    
      for(vector<int>::iterator iter=a.begin(); iter < a.end(); ++iter) {
    	  int *i = &*iter;
        ai.push_back(&*iter);
      }
    
      *(ai.at(2)) = NULL;
    
      for(vector<int>::iterator iter=a.begin(); iter < a.end(); ++iter) {
    	if(*iter != NULL)
    	  cout << *iter << " ";
      }
    
      /*for(vector<int*>::iterator iter=ai.begin(); iter < ai.end(); ++iter) {
    	if(*(*iter) != NULL)
    	  cout << *(*iter) << " ";
      }*/
    
      cin.get(); cin.get();
    
      return 0;
    }
    

    Vielen Dank an alle die mir versucht haben zu helfen 😉

    Viele Grüße,
    Samuirai


Anmelden zum Antworten