Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Abhängige Iteratoren in verschachtelten for-Schleifen

  1. #1
    Registrierter Benutzer
    Registriert seit
    20.08.2007
    Beiträge
    25

    Abhängige Iteratoren in verschachtelten for-Schleifen

    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:

    Code:
    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?
    Geändert von TheTraina (15-11-2010 um 18:51 Uhr)

  2. #2
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    Die Elemente per Index abfragen:
    Code:
    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).

  3. #3
    Registrierter Benutzer
    Registriert seit
    20.08.2007
    Beiträge
    25
    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')

  4. #4
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    Ups... Es gibt tatsächlich keine get()-ähnliche Methode...
    Ich würde es dann vl so versuchen:
    Code:
    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.

  5. #5
    Registrierter Benutzer
    Registriert seit
    20.08.2007
    Beiträge
    25
    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
    Code:
         ...
         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?
    Geändert von TheTraina (15-11-2010 um 20:38 Uhr)

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Was wäre hier mit?

    Code:
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    20.08.2007
    Beiträge
    25
    danke dir .
    oh man, manchmal sieht man den wald vor lauter bäumen nicht.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •