Iterator kopieren



  • Hier mal meine Klassenmethode:

    bool cConfigFile::setEnd(string _Head)
    {
       if (Configuration.empty())
       {
          return false;
       }
    
       list <cConfigEntry>::iterator SaveIter = Iter;
    
       Iter = Configuration.end();
       Iter--;
    
       while (_Head != Iter->getHead())
       {
          if (Iter == Configuration.begin())
          {
             Iter = SaveIter;
             return false;
          }
    
          Iter--;
       }
    
       return true;
    }
    

    Iter ist als Member der Klasse im Headerfile deklariert.
    Und Iter kriegt beim Programmstart eine Zuweisung, zeigt also auf eine
    gültige Position.
    Die Liste speichert eine eingelesene ini-Datei nach Header, Keyword und
    Values. Diese Methode soll den Iterator auf das letzte Element eines
    Headers setzen. Falls das nicht gelingt, kann ja sein, dass es den
    übergebenen Header nicht gibt, soll der Iterator wieder auf seine
    ursprüngliche Position gesetzt werden, und false zurückgegeben werden.
    In der Liste werden cConfigEntry Objekte gespeichert.
    cConfigEntry::getHead() liefert mir den Header.



  • hm... kein plan... dummerweise hocke ich grad an einem andren rechner 😞 , die ganzen header der STL habe ich hier momentan leider nicht zur verfügung... 🙄 Ansonsten würde ich im <LIST> header nachschauen, in der "list"-klasse ist irgendwo eine "iterator" bzw "const_iterator" klasse definiert, schau mal, wie der = operator definiert ist (die ganzen typedefs sind ganz oben in der list-klasse zu finden) Da kannst du direkt nachschauen, was da eigentlich gemacht wird... Aber das ganze ist leider nicht so übertrieben leserlich, wenn ich ehrlich bin... 🙄 Aber wenn sonst nichts hilft, kann man ja nen blick darein riskieren 😉

    keine ahnung, wie man sonst erfahren will, was da los ist... wahrscheinlich gibts hier andere leute, die dasselbe problem schon mal hatten... 🙄

    \edit: mit dem debugger drübergeschaut, irgendetwas auffälliges entdeckt? irgendwo muss es ja dazu kommen, dass die iteratoren irgendwie "verrutschen" und auf die falsche stelle zeigen...



  • Abre selbst wenn der =-Operator nicht so definiert ist, wie ich angenommen
    habe, müsste

    list <cConfigEntry>::iterator SaveIter(Iter);
    

    doch das gewünschte Ergebnis bringen.



  • Klar kannst du parallel über zwei Iteratoren wandern...

    #include<vector>
    #include<list>
    #include<windows.h>
    #include<iostream>
    
    int main(){
    	std::list<int> vec;
    	for(int i=0; i<10;++i){
    		vec.push_back(i);
    	}
    	std::list<int>::iterator it = vec.begin();
    	for(int i=0; i<3;++i){
    		std::cout << *it << std::endl;
    		++it;
    	}
    	std::list<int>::iterator it2 = it;
    	int j=0;
    	while(it!=vec.end() || it2!=vec.end()){
    		if(j%3==0){
    			if(it!=vec.end()){
    				std::cout << *it << std::endl;
    				++it;
    	  		}
    		}
    		else{
    			if(it2!=vec.end()){
    				std::cout << *it2 << std::endl;
    				++it2;
    	  		}
    	 	}
    		++j;
    	}
    	return 0;
    }
    

    Sowas etwa geht einwandfrei.
    Ich weiß nicht wie --it definiert ist, aber würde mich wundern, dass
    so, denn wofür gibt es dann einen reverse_iterator
    Ich würd an deiner Stelle einen reverse_iterator verwenden...

    EDIT: Genau wie den normalen Iterator verwenden mit ++i, nur stattdessen rbegin() und rend()

    Gruß,
    CSpille



  • CSpille schrieb:

    Ich weiß nicht wie --it definiert ist, aber würde mich wundern, dass
    so, denn wofür gibt es dann einen reverse_iterator

    Den gibt es, damit Algorithmen, die nur für forward-Iteratoren ausgelegt sind, die Sequenz auch rückwärts bearbeiten können. list hat bidirektionale Iteratoren, die unterstützen -- genauso wie ++ (und gäbe es -- nicht, dann gäbe es auch keine reverse-Iteratoren).



  • der reverse_iterator ist afaik einfach so eine art wrapper-template, die einen normalen iterator nimmt, alle zurückgegebenen zeiger um 1 versetzt und die -- ++ und += -= operatoren vertauscht, daran kann es also meiner meinung nach nicht liegen...



  • Ich denke nicht dass man von ".end()" ausgehen und dann "zurückwandern" darf. Würde mich wunder wenn das erlaubt wäre...



  • bei BidIt's und RanIt's geht es doch wunderbar, warum sollen denn da irgendwo schwierigkeiten auftreten?

    List hat doch einen bidirektionalen iterator, ++ unterscheidet sich eigentlich durch gar nichts vom --, man nimmt halt statt des pNext-zeigers den pPrevious-zeiger, oder wie die da heissen... Für die maschine gibt es da genau 0 unterschiede, nur die menschen sind halt dran gewohnt, irgendwo ein anfang und ein ende zu definieren...



  • Hallo,

    ich dachte für reverse Iteratoren verwendet man rbegin() und rend() ??



  • richtig.



  • Mein Segfault kommt aber schon bei der Deklaration des neuen, und bei der
    Zuweisung des alten an den neuen Iterator.
    Warum soll es nicht möglich sein, zuerst an das Ende zu springen, und dann
    mit -- zum Anfang zu wandern? Wenn ich dem Iterator an list::end() zuweise,
    steh ich ja ganz am Ende der Liste, also hinter dem letzen Eintrag. Ein
    folgendes -- würde ihn dann doch auf den letzen Eintrag bewegen.
    Aber das alles ist nicht die Ursache meines Segfaults.
    Aus irgendeinem Grund scheitert bei mir die Zuweisung.



  • Ich hab den Fehler gefunden. Ich hatte zu Testzwecken die Initialisierung
    des ersten Iterators, die beim Laden des Files stattfinden soll, auskommen-
    tiert. Er wurde also nur als Member deklariert. Deshalb scheiterte die
    Zuweisung. Jetzt geht es wie gewünscht, auch mit dem Zurückwandern.
    Danke euch!


Anmelden zum Antworten