Inkrement-Operator in for-Schleife



  • Hallo,

    ich habe bei einer von mir betreuten Doktorandin folgendes Codefragment gesehen:

    for (map<int, ConsColumnProfile*>::const_iterator it=++cons_col_profs.begin(); it != --cons_col_profs.end(); ++it) { 
        ...
    }
    

    Ich frage mich nun, ob es sinnvoll ist, wie hier gemacht,

    ++cons_col_profs.begin()
    

    statt

    cons_col_profs.begin() + 1
    

    zu schreiben (ist ja geringfuegig kuerzer).

    Von daher: Wuerdet ihr das so machen?



  • Das dürfte nur bei RandomAccess-Iteratoren funktionieren, hier also (=> map) nicht.



  • ingobulla schrieb:

    for (map<int, ConsColumnProfile*>::const_iterator it=++cons_col_profs.begin(); it != --cons_col_profs.end(); ++it) { 
        ...
    }
    

    Hier werden alle Elemente (eigtl nur vom 2. bis vorletzten) durchgegangen - ich würds aber nicht so machen. ma abgesehen davon, dass es schwachsinn ist - weil die map leer sein könnte (und ich dann zugriffsfehler bekomm) und ich nich versteh, warum man die äußeren Elemente nie brauchen sollte, aber ok...
    Und wenn die Fragen beantwortet sind, kenn ich relativ wenige Fälle, in denen man ne map (komplett) durchgehen muss - wenn das häufiger vorkommt, sollte man evtl nen anderen Container wählen ^^

    ingobulla schrieb:

    Ich frage mich nun, ob es sinnvoll ist, wie hier gemacht,

    ++cons_col_profs.begin()
    

    statt

    cons_col_profs.begin() + 1
    

    (ist ja geringfuegig kuerzer)

    also für mich ist +1 länger 😛
    und langsamer ist das erste auch auf keinen Fall...
    Wenn man das zweite schreiben möchte, müsste man scho std::advance nutzen - ansonsten braucht man wie gesagt random access iteratoren - und die haben die wenigsten Container ^^

    bb

    PS:
    je nach dem, was du nun wirklich möchtest - angenommen, du möchtest alle objekte durchgehen, dann würd ichs so schreiben:

    typedef map<int, ConsColumnProfile*> ProfileContainer;
    
    for (ProfileContainer::const_iterator i(cons_col_profs.begin()), e(cons_col_profs.end()); i != e; ++i)
    {
        //...
    }
    

    edit: stoiber-satz beseitigt ^^


Anmelden zum Antworten