Frage zu For-Schleife und Iteration?



  • folgende Schleife soll vom Listen ende bis zur Position (it_New) rückwärte die liste travesieren, dabei soll die forschleife nich bei it_New, sonder eine einheit davor beginnen. bisher so gelöst:

    for(std::list<CAllocStruct::CAllocNode*>::iterator it = it_New; it!= m_pMyBase->m_lList.begin();){
    
    		--it;
    .
    .   //Mit inhalt von it arbeiten
    .
    
    }
    

    gibts da ne bessere variante?



  • sieht doch ok aus. wenn du das --it in der schleife nicht haben willst, verlager es doch in den for body.

    for(--(std::list<CAllocStruct::CAllocNode*>::iterator it = it_New); it!= m_pMyBase->m_lList.begin(); --it)
    // müsste eigentlich auch gehen:
    for(std::list<CAllocStruct::CAllocNode*>::iterator it = (it_New - 1); it!= m_pMyBase->m_lList.begin(); --it)
    

    schöner find ich die version allerdings nicht ^^



  • Ja, verwend nen reverse_iterator und rbegin, rend der Liste:

    for ( list_type::reverse_iterator it( list.rbegin() ); it != list.rend(); ++it )
    {
    	std::cout << ( *it ) << std::endl;
    }
    


  • moment, vergiss meine lösung. die ist fehlerhaft 😃



  • ist sowas möglich#?

    for(--(std::listCAllocStruct::CAllocNode*::iterator it = it_New); it!= m_pMyBase->m_lList.begin(); --it)



  • BorisDieKlinge schrieb:

    ist sowas möglich#?

    for(--(std::listCAllocStruct::CAllocNode*::iterator it = it_New); it!= m_pMyBase->m_lList.begin(); --it)

    Nein. Was spricht deiner Meinung gegen den reverse_iterator?



  • jepp schau mir den grad an;)



  • BorisDieKlinge schrieb:

    ist sowas möglich#?

    for(--(std::listCAllocStruct::CAllocNode*::iterator it = it_New); it!= m_pMyBase->m_lList.begin(); --it)

    ich sagte ja, es sei fehlerhaft 😉 der fehler ist aber primär, dass der iterator so möglicherweise nicht korrekt überprüft wird, nämlich genau dann, wenn it_New bereits auf m_lList.begin() zeigt.

    das sekundäre problem ist, dass durch die klammerung die deklaration verschwindet. grundsätzlich geht sowas aber schon.

    std::list<CAllocStruct::CAllocNode*>::iterator it;
    for(--(it = it_New); it!= m_pMyBase->m_lList.begin(); --it)
    

    der primäre fehler ist natürlich weiterhin enthalten.



  • BorisDieKlinge schrieb:

    folgende Schleife soll vom Listen ende bis zur Position (it_New) rückwärte die liste travesieren, dabei soll die forschleife nich bei it_New, sonder eine einheit davor beginnen. bisher so gelöst:

    for(std::list<CAllocStruct::CAllocNode*>::iterator it = it_New; it!= m_pMyBase->m_lList.begin();){
    		
    		--it;
    .   //Mit inhalt von it arbeiten
    }
    

    gibts da ne bessere variante?

    for( std::list<CAllocStruct::CAllocNode*>::reverse_iterator it( it_New ) // it zeigt hier auf eine Position VOR it_New
            ; it != m_pMyBase->m_lList.rend(); ++it )
        {
            // mit *it arbeiten
    

    Gruß
    Werner



  • BorisDieKlinge schrieb:

    folgende Schleife soll vom Listen ende bis zur Position (it_New) rückwärte die liste travesieren, dabei soll die forschleife nich bei it_New, sonder eine einheit davor beginnen.

    Also entweder ich bin jetzt völlig bekloppt, oder deine Beschreibung und dein Code passen überhaupt nicht zusammen. Du schreibst: "vom Listen ende", das wäre list.end(). "bis zur Position (it_New) rückwärte" impliziert, dass it_New *vor* list.end() liegt und damit den Endpunkt der Traversierung markiert. Damit ist "dabei soll die forschleife nich bei it_New, sonder eine einheit davor beginnen" unlogisch, da du damit einen Startpunkt außerhalb des zu traversierenden Bereichs hättest.

    Dein Code hingegen sagt: Von it_new rückwärts bis list.begin(). Damit traversierst du also nicht "vom Listen ende" sondern von it_new und nicht "bis zur Position (it_New) rückwärte" sondern bis list.begin().

    Mal davon abgesehen: Wie bereits gesagt wurde, gibt es zum rückwärts-traversieren von STL-Containern extra die reverse-Iteratoren. Die Alternative wäre die kanonische Schleife fürs Rückwärtslaufen (benutzt man meist, wenn man mit unsigned-Werten arbeitet)
    Zur Erinnerung:

    iterator x = list.end();
    while (x != list.begin()) {
       --x;
       // do something with x
    }
    

    Für deinen Fall, so ich ihn denn richtig verstehe:

    iterator x = it_New;
    while (x != list.begin()) {
       --x;
       // do something with x
    }
    

    Der Unterschied zu deiner Schleife ist übrigens, dass diese hier auch bei einer leeren Liste funktioniert.


Anmelden zum Antworten