PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abhängige Iteratoren in verschachtelten for-Schleifen



TheTraina
15-11-2010, 18:48
Hallo,
ich habe eine kleine Frage. Und zwar habe ich eine Liste 'mylist' (von mir aus mit integer werten), die ich wie folgt durchlaufen möchte:



std::list< int >::iterator it_1;
for ( it_1=mylist.begin(); it_1 != mylist.end(); it_1++ ) {
std::list< int >::iterator it_2;
for ( it_2= it_1 + 1; it_2 != mylist.end(); it_2++ ) {
//... things to do
}
}

Iterator it_2 soll also (in derselben Liste) eins weiter anfangen als Iterator it_1 schon ist.
Natürlich meckert der Compiler in obigem Fall herum, da '+' für so einen Fall nicht definiert ist. Wie macht man das am Besten?

John W
15-11-2010, 19:34
Die Elemente per Index abfragen:


for (int i = 0 ; i < mylist.size() ; ++i)
{
Object myobj_a = mylist.get(i);
for (int j = i+1 ; j < mylist.size() ; ++i)
{
Object myobj_b = mylist.get(j);
...
}
}

Ich hab jetzt einfach mal Java verwendet, in C müsstest du Datentyp anpassen und evtl. size() und get() mit entsprechenden Methoden ersetzen (mein C ist angeknackst^Weingestaubt).

TheTraina
15-11-2010, 19:48
hey, ich wüsste nicht, dass es so eine methode "get" für den container list gibt. klar kann man sich da jetzt was selbst basteln, aber da gibt es doch bestimmt eine gaaaanz einfache lösung (ähnlich zu 'j=i+1') ;)

John W
15-11-2010, 19:55
Ups... Es gibt tatsächlich keine get()-ähnliche Methode...
Ich würde es dann vl so versuchen:


std::list< int >::iterator it_1;
for ( it_1=mylist.begin(); it_1 != mylist.end(); it_1++ ) {
std::list< int >::iterator it_2;
iterator it_2 = mylist.begin();
while (it_2 != it_1) it_2++;
for ( it_2++ ; it_2 != mylist.end(); it_2++ ) {
//... things to do
}
}

Der Grundgedanke hier ist, die Elemente zwar zu durchlaufen, aber zu überspringen, wenn der Index nicht stimmt.

TheTraina
15-11-2010, 19:59
okay, das ginge natürlich, auch wenns nicht schön ist ;). hätte gedacht, dass der container list bzw. der iterator für so einen fall, wie ich ihn hier habe (und der ist ja jetzt nicht gerade selten), etwas einfaches bereitstellt (quasi it+1 oder it->next() oder ähnliches). gerade, wenn die liste lange ist, dauert die while-schleife ja auch ne zeit.

kennt jemand vielleicht da noch was einfacheres, was (quasi) keine zusätzliche rechenzeit erfordert?


edit: habe jetzt meine list gerade mal in einen vector verwandelt und siehe da. hier kann ich einfach


...
for ( it_2 = it_1+1 ; it_2 != myvector.end(); it_2++ )
...

schreiben.

frage ist: ist 'vector' (viel) langsamer als 'list' oder gibt es für list auch etwas entsprechendes?

anda_skoa
16-11-2010, 00:32
Was wäre hier mit?



std::list< int >::iterator it_1;
for ( it_1=mylist.begin(); it_1 != mylist.end(); it_1++ ) {
std::list< int >::iterator it_2 = it_1;
for ( ++it_2; it_2 != mylist.end(); it_2++ ) {
//... things to do
}
}

Also zuerst den Iterator kopieren, dann die Kopie eins weiter setzen.

Ciao,
_

TheTraina
16-11-2010, 13:59
danke dir :).
oh man, manchmal sieht man den wald vor lauter bäumen nicht.