for -Schleife mit besonderem Zähler??
-
Hallo ich möchte eine for schleife programmieren:
Forgaben:int iCount =3;
nur möchte ich das die for- schleife iCount 3 bis 0 runterzähl, und dann wieder
0 bis 3 hochzähl, so das sie insgesamt 6 iterationen hat!!gibt da ne esay elegante lösung?? weil umständlich oder mit 2 forschleifen bekomm ich das auch hin.. vll. hat von euch jemand ne kurze knackige lösung
-
Du möchtest also eine Liste erst vorwärts dann rückwärts durchlaufen und dabei das gleiche machen?
Da frag ich mich ob das was du da machst nicht generell anders anpacken sollte...
-
lol sowas?
for(int i = 3,j = 0; i>=0, j<3;--i,++j) { }
-
BorisDieKlinge schrieb:
nur möchte ich das die for- schleife iCount 3 bis 0 runterzähl, und dann wieder
0 bis 3 hochzähl, so das sie insgesamt 6 iterationen hat!!Das geht nicht, weil von 3-0 sind 4 und dann wieder hoch sind wieder 3 => Sieben Iterationen...
3, 2, 1, 0, 1, 2, 3 => Sieben.int iCount = 3; for( int i=iCount, dir=1; i < (iCount + 1); i -= dir, dir = ( i ) ? dir : -dir ) printf( "i: %d\n", i );Achtung: Humor!
Nimm zwei Schleifen und eine inline-Funktion.
Edit: 'inline' sofern der Inhalt der Schleife klein genug ist. Ist er zu groß und muss der Sprung zur Funktion gespart werden, kann das oben stehende auch eine Optimierung darstellen, da der Vergleich und die Zuweisung schneller abläuft als der Sprung in eine Funktion.
-
Der Index der hochzählt muß eben bei -2 beginnen und darf erst dann ausgewertet werden wenn der andere Index == 0 ist...
-
Hallo Boris,
es gibt eine elegante - aber weniger easy - Möglichkeit, wenn Du einen selbst geschriebene Iterator nutzt.
Der Code, der von 3 beginnend runter auf 0 und wieder bis 3 hoch zählt, sähe dann vielleicht so aus:for( V_Iterator i( 3 ); i != V_Iterator::end( 3 ); ++i ) { cout << "> " << *i << endl; }V-Iterator, da der Verlauf des Indizes wie ein V aussieht. Der Code vom V_Iterator ist:
#include <iterator> class V_Iterator : std::iterator< std::input_iterator_tag, int > { public: explicit V_Iterator( int idx, int delta = -1 ) : m_idx( idx ), m_delta( delta ) {} int operator*() const { return m_idx; } V_Iterator& operator++() { // nur hier steht der Code, wie man von einem Index zum nächsten kommt if( m_idx == 0 ) m_delta = -m_delta; m_idx += m_delta; return *this; } bool operator==( const V_Iterator& b ) const { return m_idx == b.m_idx && m_delta == b.m_delta; } static V_Iterator end( int back_idx ) { return V_Iterator( back_idx + 1, +1 ); } // -- 'automatics'; aber siehe boost.operators input_iterator_helper bool operator!=( const V_Iterator& b ) const { return !( *this == b ); } V_Iterator operator++( int ) { V_Iterator ret( *this ); this->operator++(); return ret; } private: int m_idx; int m_delta; };siehe dazu auch boost.counting_iterator
Vorteil: der Code, der den Verlauf des Indexes kontrolliert, ist von der eigentlichen Schleife getrennt und man kann auch STL-Algorithmen einsetzen - z.B.: for_each.
Gruß
Werner
-
BorisDieKlinge schrieb:
Hallo ich möchte eine for schleife programmieren:
Forgaben:int iCount =3;
nur möchte ich das die for- schleife iCount 3 bis 0 runterzähl, und dann wieder
0 bis 3 hochzähl, so das sie insgesamt 6 iterationen hat!!gibt da ne esay elegante lösung?? weil umständlich oder mit 2 forschleifen bekomm ich das auch hin.. vll. hat von euch jemand ne kurze knackige lösung
Sinn?
-
Hallo,
wäre es nicht einfacher, die Laufvariable von 0 bis 6 (oder was auch immer) laufen zu lassen und dann einfach den Index zu berechnen?
Quasi:for (int i = 0, index = 3; i < 6; index = abs(3 - ++i)) { }
-
das ist ja noch viel schwieriger zu verstehen.
-
HumeSikkins schrieb:
Hallo,
wäre es nicht einfacher, die Laufvariable von 0 bis 6 (oder was auch immer) laufen zu lassen und dann einfach den Index zu berechnen?Waere auch meine erste Idee gewesen. Auch wenn ich das nicht alles in der Schleifenkopf packen wuerde. Kann man sicher wunderbar drueber streiten, obs da reingehoert...
for (int i = 0; i <= 6; ++i) { int index = abs(3 - i); [...] }
-
hey danke für die zahlreichen antworten....:)
Aber diejenigen die nach dem "sinn?" des algotihmus fragten kann ich leider keine schnelle und eifnach antwort drauf geben.. aber in meinem fall macht es ein sinn:)
GRüße