for schleife



  • Hallo zusammen,

    ich habe ein merkwürdiges Verhalten bei meiner for-Schleife.

    info: scheiben ist ein vektor<int>

    cout << "scheiben.size: " << scheiben.size()<< endl;
    for (unsigned int i = scheiben.size()-1; i > 0; i--) {
      cout << "i: " << i << endl;
    }
    

    Die Ausgabe ist:
    scheiben.size: 4
    i: 3
    i: 2
    i: 1

    soweit so gut... wenn ich aber die Abbruchsbedingung auf i >= 0 setze, werden irgendwelche Grossen Zahlen ausgegeben:

    for (unsigned int i = scheiben.size()-1; i >= 0; i--) {
             cout << "i: " << i << endl;
         }
    

    Bin über jeden Hinweis dankbar.

    VG



  • Was ist denn 0-1 bei einem unsigned?



  • ohhhhh, vielen Dank!
    Kannst Du mir ein Vorschlag geben wie ich den Vektor vom größtem bis zum kleinsten Index durchlaufen kann.

    Eine Möglichkeit wäre:

    if(i == 0)
        break;
    

    Finde ich aber nicht so schön.



  • for (size_t i = scheiben.size(); i-- > 0;) {
        cout << "i: " << i << '\n';
    }
    
    typedef vector<int>::reverse_iterator iter;
    for (iter it=scheiben.rbegin(), end=scheiben.rend(); it!=end; ++it)
        cout << *it << '\n';
    


  • - Iteratoren und rbegin/rend
    - signed int benutzen
    - Aussen bis i>0 und innen mit j=i-1 arbeiten



  • ich danke euch für die Hilfe! Sehr nett



  • size_t i = scheiben.size() - 1;
    while(i < scheiben.size()) {
        cout << "i: " << i-- << '\n';
    }
    

  • Mod

    for ( int i = first; i != last; ++i )
    {
        do_something(i);
    }
    

    -->äquivalent (ohne continue/goto) zu

    for ( int i = first; i != last; )
    {
        do_something(i);
        ++i;
    }
    

    --> Umkehrung der Reihenfolge (auch der Schleifenkörper wird gedanklich rückwärts durchlaufen).

    for ( int i = last; i != first; )
    {
        --i;
        do_something(i);
    }
    

    -->Integration in die Schleifenbedingung (setzt nat. voraus, dass beim Dekrementieren kein Überlauf entsteht, wenn i wie hier vorzeichenbehaftet ist).

    for ( int i = last; i-- != first; )
    {
        do_something(i);
    }
    

    Aus

    for (unsigned int i = 0; i != scheiben.size(); ++i) {
             cout << "i: " << i << endl;
         }
    

    wird also

    for (unsigned int i = scheiben.size(); i-- != 0; ) {
             cout << "i: " << i << endl;
         }
    

Log in to reply