Iterator kopieren
-
Abre selbst wenn der =-Operator nicht so definiert ist, wie ich angenommen
habe, müsstelist <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_iteratorDen 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!