tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
418
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    schickano schickano ist offline Mitglied
    Registriert seit
    Dec 2009
    Beiträge
    15
    Hallo Leutz,

    ich hab viel mit Matrizen zu tun.
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    
        vector<double> value;
        vector<vector<double>> matrix;
     
        for(int i = 0; i < 10; ++i)
            value.push_back(i);
        for(int i = 0; i < 5; ++i)
            matrix.push_back(value);
    Um auf die einzelnen Elementen zuzugreifen habe ich stinknormale for-Schleifen benutzt. Wie z.B.
    Code cpp:
    1
    2
    3
    4
    5
    
        for(int row = 0; row < matrix.size(); ++row){
            for(int column = 0; column < matrix.at(row).size(); ++column)
                cout << matrix.at(row).at(column) << '\t';
            cout << endl;
        }
    Letztens habe ich wat über Iteratoren gelesen und wollte einfach ma los programmieren.

    Resultat:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    
        vector<vector<double>>::iterator it_row;
        vector<double>::iterator it_column;
        
        for(it_row = matrix.begin(); it_row < matrix.end(); ++it_row)
            for(it_column = matrix.at(it_row).begin(); it_column matrix.at(it_row).end(); ++it_column)
                cout << *it_column << '\t';
        cout << endl;
    Naja, das funktioniert natürlich nicht! Ehrlich gesacht, kam ich schon ab der zweiten for-Schleife ins schwitzen.
    Könnt ihr mir da Tipps geben und würdet ihr mir empfehlen weiter mir Iteratoren zu arbeiten? Wenn ja, warum? Bzw wo liegt da der Vorteil.

    tausend Dank im voraus
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Mit Iteratoren zu arbeiten ist sicherlich sinnvoll. Es reduziert Fehlerquellen beim Arbeiten mit Indizes (< oder <= Länge?) und ist manchmal auch noch effizienter. Außerdem kann man den zugrundeliegenden Container austauschen ohne den Code ändern zu müssen.

    Dazu sollte man aber nicht per Hand die Iterator-Typen angeben, sondern typedef's benutzen:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    // Typ Alias vereinbaren
    typedef std::vector<std::vector<double> > matrix_type;
     
    matrix_type matrix;
     
    // ...
     
    // wenn die Elemente nicht verändert werden, besser const_iterator verwenden, 
    // sonst iterator
     
    for (matrix_type::const_iterator row = matrix.begin(), row_end = matrix.end();
         row != row_end; 
         ++row)
    {
       for (matrix_type::value_type::const_iterator col = row->begin(), col_end = row->end();
            col != col_end;
            ++col)
       {
           cout << *col << '\t';
       }
       cout << endl;
    }

    Richtig nützlich sind die Iteratoren aber wenn man sie mit den Standardalgorithmen kombiniert:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    
    for (matrix_type::const_iterator row = matrix.begin(), row_end = matrix.end();
          row != row_end; 
          ++row)
    {
       std::copy (row->begin(), row->end(), ostream_iterator<double>(cout, "\t"));
       cout << endl;
    }
    Gruß
    Geändert von deepthroat (08.01.10 um 08:09 Uhr)
    schickano bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von Jennesta
    Jennesta Jennesta ist offline Mitglied Gold
    Registriert seit
    Sep 2007
    Ort
    Aachen
    Beiträge
    215
    Hey deepthroat,
    wo du hier das Beispiel mit den Iteratoren gemacht hast.
    Kannst du kurz erklären was der unterscheid zwischen const_iterator und iterator ist?
    Leider steht genau das in meinem C++-Buch nicht drinnen.
    Grüße
     
    Was soll daran kompliziert sein? Es muss doch nur ein Rad bewegt werden, man kann aufsteigen, es kommt die Matschhütte und durch den Regenbogen gelangst du zum hungrigen Affen, der Affenschwanz wird gezogen und bums kommst du zum Paradispark.

  4. #4
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    schau mal hier (ziemlich am Ende) .....
    http://www.math.uni-bayreuth.de/~rba...ml/node77.html

    Quelle: kurze Google-Suche nach "const_iterator iterator" (3. Ergebnis)

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

Ähnliche Themen

  1. XPresso Iterator
    Von axn im Forum Cinema 4D
    Antworten: 2
    Letzter Beitrag: 26.03.10, 21:58
  2. Iterator liefert Mist
    Von little-smile im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 28.05.09, 18:40
  3. Iterator nicht korrekt
    Von little-smile im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 25.05.09, 10:11
  4. iterator problem
    Von sim26 im Forum Java
    Antworten: 4
    Letzter Beitrag: 01.09.06, 15:51
  5. Iterator - Fehler
    Von Der Held im Forum Java
    Antworten: 9
    Letzter Beitrag: 20.10.05, 22:33