Listen Iterator um mehr als eins erhöhen

Maxx03

Grünschnabel
Hi.

Noch ne Frage (wieder bei google und in den Tutorials nix passendes gefunden)

Ich will in großen Listen (list<int> aus std) hin und herspringen und elemente löschen, aus- und einlesen...

Ich habe dafür extra list<int> und nicht vector<int> genommen, damit das löschen schneller geht. Dafür kann man doch bei den listen nur mit den iteratoren auf die elemente zurückgreifen.

Und ich weiss nun nicht wie ich einen Iterator z.B. um 130 erhöhen kann um auf das 131 ste Element zuzugreifen. Wenn ich dafür for schleifen verwende (also "for(int i=0;i<130;i++) iterator++;") dann wird das Ganze elendig langsam.

Kann man nicht irgendwas in der Form "iterator=iterator+130" machen ?
 
Hi.

Noch ne Frage (wieder bei google und in den Tutorials nix passendes gefunden)

Ich will in großen Listen (list<int> aus std) hin und herspringen und elemente löschen, aus- und einlesen...

Ich habe dafür extra list<int> und nicht vector<int> genommen, damit das löschen schneller geht. Dafür kann man doch bei den listen nur mit den iteratoren auf die elemente zurückgreifen.

Und ich weiss nun nicht wie ich einen Iterator z.B. um 130 erhöhen kann um auf das 131 ste Element zuzugreifen. Wenn ich dafür for schleifen verwende (also "for(int i=0;i<130;i++) iterator++;") dann wird das Ganze elendig langsam.

Kann man nicht irgendwas in der Form "iterator=iterator+130" machen ?
Nein, bei einer Liste (bzw. dessen Iterator) ist das nicht möglich.

Verwende doch eine deque.

Gruß
 
aber ich dachte bei deque hat man auch das Problem das Löschen von Elementen (ausser dem ersten und letzten) lange dauert

Ich will sowas in der Art

Liste mit 1' 000' 000 elementen.

Lösche Element 100
Lösche Element 200
Lösche Element 300
....
setze Element 150 = 2
setze Element 250 = 1
setze Element 350 = 0
.....
lese Element 15000 aus
lese Element 16000 aus
....

Am meisten lösche ich jedoch. Am Ende vom Programm sind alle Elemente der Liste gelöscht. Das hab ich mal mit vectoren implementiert und das Löschen aller Elemente hat da ca. 10 mal so lange gedauert...

Meinst Du das geht mit deque schneller ?
 
aber ich dachte bei deque hat man auch das Problem das Löschen von Elementen (ausser dem ersten und letzten) lange dauert
Ja, das stimmt. Für das Löschen mittendrin ist die deque eine schlechte Wahl.

Du könntest ja probieren die List-Iteratoren in einen Vektor zu cachen um schnell um einige dutzend Elemente weiterzuspringen.

Gruß
 
Die offizielle (irgendjemand findet das elegant) Methode lautet:

std::advance( itMeinIterator, step-wert );
 
Hi.

Das brauchst du nicht zu probieren. Da wird auch nur eine Schleife verwendet um den Iterator entsprechend weiterzusetzen.

Gruß
 
Bist du sicher?
Ich würde meinen, das Ding würde bei Containern, wo das machbar ist, da auf etwas Optimaleres wechseln.

Obwohl, bei einer Liste...
 
Bist du sicher?
Ich würde meinen, das Ding würde bei Containern, wo das machbar ist, da auf etwas Optimaleres wechseln.

Obwohl, bei einer Liste...
Ja, bei Containern die das unterstützen wird direkt der operator+= verwendet um den Iterator entsprechend weiterzusetzen. Ein Listeniterator unterstützt das nicht (ist eben kein Radom Access Iterator) und somit muß das in einer Schleife gemacht werden.

@Maxx03: Aber noch eine andere Idee: verwende doch einen Random Access Container und merke dir welche Elemente gelöscht sind und welche nicht - du brauchst sie ja nicht wirklich aus dem Container löschen...

Gruß
 
Zurück