C#-Style foreach
-
Hallo
In C# geht ja das:
foreach(int foo in Array) { foo = 0; }Gibt's in C++ (nicht C++0x) einen Weg das zu lösen? Also ich meine mit Iteratoren aber ohne einer Funktion.
MfG, EOutOfResources
-
In algorithm gibt es for_each und es gibt auch BOOST_FOREACH. Eventuell sind das ja für dich zwei gescheite Alternativen.
Edit: Vergiss ersteres und schu dir BOOST an

-
Eben, das
std::for_eachaus<algorothm>braucht eine Funktion.BOOST_FOREACHkenne ich nicht. Ich schau es mir mal an.
-
In C++0x kommt dann wohl auch "foreach"
int my_array[5] = {1, 2, 3, 4, 5}; for (int &x: my_array) { x *= 2; }
-
Oder mach C++0x an.
http://en.wikipedia.org/wiki/C%2B%2B0x#Range-based_for-loop
-
Mein derzeitiger Compiler will das nicht.
-
Man kann auch Zeiger als Iteratoren nehmen:
int array[5]; for(int* i = array; i != array+5; ++i) // tue was mit *i
-
EOutOfResources schrieb:
Hallo
In C# geht ja das:
foreach(int foo in Array) { foo = 0; }Gibt's in C++ (nicht C++0x) einen Weg das zu lösen? Also ich meine mit Iteratoren aber ohne einer Funktion.
Mit einer ganz normalen for - Schleife:
for(container<int>::iterator it = mycontainer.begin(); it != mycontainer.end(); ++it) { *it = 0; }
-
Belli schrieb:
Mit einer ganz normalen for - Schleife
Das ist mir natürlich klar. Ich meine mit ähnlicher Schreibweise.
-
Warum nicht so:
std::fill(v.begin(), v.end(), 0);Fill geht zwar nicht überall, aber da gehen andere Funktionen.
Mit Algorithm und Boost und im NotfallBOOST_FOREACHhat man eigentlich keinen Grund, sich so etwas wie in C# zu wünschen. Wenn ich mir etwas wünsche, dann Ranges.
-
warumnichtcpp schrieb:
Warum nicht so
Weil ich eigentlich komplexere Aufgaben vorgesehen habe.
warumnichtcpp schrieb:
zu wünschen
Ich wünsche es mir nicht, sondern Frage, wie man so etwas mit kurzer Schreibweise in C++ macht (und ohne externen Funktionen).
Ich werde noch bis C++0x warten. Da hat man zudem noch Lambda-Funktionen
.Danke und mfG, EOutOfResources
-
warumnichtcpp schrieb:
und im Notfall
BOOST_FOREACHIch verwende
BOOST_FOREACHeigentlich dauernd, nicht nur im Notfall.
Ich kenne viele die es total ih und pfui finden. Bei mir ist das genau umgekehrt.BOOST_FOREACHist einfach nur geil, und saupraktisch noch dazu. Auch die Art wie es implementiert ist finde ich einfach nur cool.----
EOutOfResources schrieb:
Ich werde noch bis C++0x warten. Da hat man zudem noch Lambda-Funktionen
.Was gefällt dir denn an
BOOST_FOREACHnicht?
-
hustbaer schrieb:
Was gefällt dir denn an
BOOST_FOREACHnicht?Den unmodularen Makro-Style.
-
lol
ok
-
EOutOfResources schrieb:
hustbaer schrieb:
Was gefällt dir denn an
BOOST_FOREACHnicht?Den unmodularen Makro-Style.
Das wäre bei einem
foreach-Schlüsselwort inwiefern anders?
-
ipsec schrieb:
Das wäre bei einem
foreach-Schlüsselwort inwiefern anders?Du sagst es ja selbst! Das es ein reserviertes Schlüsselwort ist.
-
Das ist dann aber auch unmodular. Oder anders: wenn BOOST_FOREACH kein Makro wäre, sondern so als Schlüsselwort in C++ existieren würde, welche Vorteile hätte das?
Oder geht es dir um den Namen? Dann reicht ein
#define foreach BOOST_FOREACH.
-
EOutOfResources schrieb:
Den unmodularen Makro-Style.

Dabei gäbe es ja durchaus echte Vorteile, die Range-Based-For gegenüber
BOOST_FOREACHvorzuweisen hat. Zum Beispiel, dass es mit Kommas im Typen klarkommt. Oder dass kein Laufzeitoverhead entsteht.
-
ipsec schrieb:
Oder geht es dir um den Namen?
Nein.
Eigentlich hat sich meine Frage auf die Schreibweise bezogen. Ob man so etwas schreiben kann:
std::list<int> foo; std::deque<int> bar; //foo und barfüllen foreach(int& a, foo) { foreach(int& b, bar) { b += --a; } }
-
Jup, das geht mit BOOST_FOREACH genau so.
Vorteil des Schlüsselworts wäre noch, dass der Compiler die Struktur "kennt" und eventuell besser optimieren kann. Aber im Prinzip gibt es eigentlich keinen Grund, BOOST_FOREACH nicht zu verwenden, wenn man keine direkte Sprachunterstützung hat.