C#-Style foreach



  • 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 Notfall BOOST_FOREACH hat 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_FOREACH

    Ich verwende BOOST_FOREACH eigentlich dauernd, nicht nur im Notfall.
    Ich kenne viele die es total ih und pfui finden. Bei mir ist das genau umgekehrt. BOOST_FOREACH ist 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_FOREACH nicht?



  • hustbaer schrieb:

    Was gefällt dir denn an BOOST_FOREACH nicht?

    Den unmodularen Makro-Style.



  • lol
    ok



  • EOutOfResources schrieb:

    hustbaer schrieb:

    Was gefällt dir denn an BOOST_FOREACH nicht?

    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_FOREACH vorzuweisen 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.


Anmelden zum Antworten