Foreach-Schleife in C ++ entspricht C #

75

Wie würde ich diesen Code in C ++ konvertieren?

string[] strarr = {"ram","mohan","sita"};    
foreach(string str in strarr) {
  listbox.items.add(str);
}
Swapnil Gupta
quelle

Antworten:

123

Fernkampf basierend auf :

std::array<std::string, 3> strarr = {"ram", "mohan", "sita"};
for(const std::string& str : strarr) {
  listbox.items.add(str);
}

vor c ++ 11

std::string strarr[] = {"ram", "mohan", "sita"};
for(int i = 0; i < 3; ++i) {
  listbox.items.add(strarr[i]);
}

oder

std::string strarr[] = {"ram", "mohan", "sita"};
std::vector<std::string> strvec(strarr, strarr + 3);
std::vector<std::string>::iterator itr = strvec.begin();
while(itr != strvec.end()) {
  listbox.items.add(*itr);
  ++itr;
}

Mit Boost - :

boost::array<std::string, 3> strarr = {"ram", "mohan", "sita"};
BOOST_FOREACH(std::string & str, strarr) {
  listbox.items.add(str);
}
fehlender Faktor
quelle
3
@ronag: Die akzeptierte Antwort hier spiegelt meine Meinung zu std::for_each.
fehlender Faktor
2
Was ist mit der Größe des Arrays wie for(int i = 0; i < sizeof(strarr)/sizeof(strarr[0]); i++)im ersten Codebeispiel?
Thorben
Da C ++ 11 6 Jahre alt ist und 3 Standards zurückliegt, kann ich vorschlagen, den C ++ 11-Teil der Frage nach oben zu verschieben. Nehmen wir in der Tat C ++ 11 als Standard an und erwähnen C ++ nicht. Erwähnen Sie stattdessen C ++ 98 für das andere.
Bolov
@bolov, das ist eine sieben Jahre alte Antwort, Kumpel. Ich habe seit sechs Jahren kein C ++ mehr geschrieben. Bitte zögern Sie nicht, die Antwort nach Belieben zu aktualisieren.
fehlender Faktor
@missingfaktor sicher, kein Problem
Bolov
28

In C ++ 0x haben Sie

for(string str: strarr) { ... }

Aber bis dahin verwenden Sie gewöhnliche for-Schleife.

Artyom
quelle
14

Nachdem varich mich an das Schlüsselwort in C # gewöhnt habe, beginne ich, das autoSchlüsselwort in C ++ 11 zu verwenden. Beide bestimmen den Typ durch Inferenz und sind nützlich, wenn der Compiler nur den Typ für Sie herausfinden soll. Hier ist der C ++ 11-Port Ihres Codes:

#include <array>
#include <string>

using namespace std;

array<string, 3> strarr = {"ram", "mohan", "sita"};
for(auto str: strarr) {
  listbox.items.add(str);
}
Thane Plummer
quelle
5

Boost hat ein Makro, das dies für Sie erledigt.

http://www.boost.org/doc/libs/1_44_0/doc/html/foreach.html

Anycorn
quelle
Ich weiß, dass Google in dieser Hinsicht scheiße ist, also nicht deine Schuld, aber die neueste Version ist 1.44, also sollte der Link Container 1_44, nicht 1_35 sein. (Sie müssen die Google-Ergebnisse von Hand
korrigieren
Vielen Dank. Ich habe 1.44 heruntergeladen und auf mein System gebaut, habe aber nicht an die Version gedacht, als ich das gepostet habe.
5

Nur zum Spaß (neue Lambda-Funktionen):

      static std::list<string> some_list;

      vector<string> s; 
      s.push_back("a");
      s.push_back("b");
      s.push_back("c");

      for_each( s.begin(), s.end(), [=](string str) 
        {
          some_list.push_back(str);
        }

  );

  for_each( some_list.begin(), some_list.end(), [](string ss) { cout << ss; } );

Obwohl eine einfache Schleife empfohlen wird :-)

AndersK
quelle
2

Etwas wie:

const char* strarr = {"ram","mohan","sita", 0L};

for(int i = 0; strarr[i]; ++i)
{
  listbox.items.add(strarr[i]);
}

Funktioniert auch für Standard C. Ich bin mir in C ++ nicht sicher, wie das Ende des Strarrs erkannt werden kann, ohne ein Null-Element zu haben, aber das Obige sollte funktionieren.

Matt
quelle
Wenn es sich um ein statisch zugewiesenes Array handelt, erhalten sizeof(strarr)/sizeof(strarr[0])Sie die Anzahl der Elemente im Array. Wenn es sich jedoch um ein dynamisch zugewiesenes Array handelt (oder wenn Sie nur einen Zeiger haben), gibt es keine Möglichkeit, die Größe zu ermitteln - Sie müssen sie auf andere Weise außerhalb des Bandes ermitteln.
Adam Rosenfield
Der richtige Typ für die Größe (und damit einen Index in) eines Arrays ist std::size_t.
sbi
1

string [] strarr = {"ram", "mohan", "sita"};

#include <string>
std::string strarr = { "ram", "mohan", "sita" };

oder

const char* strarr[] = { "ram", "mohan", "sita" };

foreach (Zeichenfolge str in strarr) {listbox.items.add (str); }}

for (int i = 0; i < sizeof strarr / sizeof *strarr; ++i)
    listbox.items.add(strarr[i]);

Hinweis: Sie können die Zeichenfolgen auch in einen std :: -Vektor anstatt in ein Array einfügen:

std::vector<std::string> strvec;
strvec.push_back("ram");
strvec.push_back("mohan");
strvec.push_back("sita");

for (std::vector<std::string>::const_iterator i = strvec.begin(); i != strvec.end(); ++i)
    listbox.items.add(*i);
Tony Delroy
quelle
1

Die einfache Form:

std::string  data[] = {"ram","mohan","sita"};
std::for_each(data,data+3,std::bind1st(std::mem_fun(&Y::add), &(listbox.items)));

Ein Beispiel in Aktion:

#include <algorithm>
#include <string>
#include <iostream>
#include <functional>

class Y
{
    public:
      void add(std::string value)
      {
          std::cout << "Got(" << value << ")\n";
      }
};
class X
{
    public:
      Y  items;
};

int main()
{
    X listbox;

    std::string  data[] = {"ram","mohan","sita"};
    std::for_each(data,data+3,std::bind1st(std::mem_fun(&Y::add), &(listbox.items)));
}
Martin York
quelle
0

Wenn Sie ein Array haben, können Sie einfach eine forSchleife verwenden. (Es tut mir leid, aber ich werde den Code für eine forSchleife nicht für Sie eingeben .)

EMP
quelle
0

Die Verwendung von Boost ist die beste Option, da Sie damit einen übersichtlichen und präzisen Code bereitstellen können, aber wenn Sie sich an STL halten möchten

void listbox_add(const char* item, ListBox &lb)
{
    lb.add(item);
}

int foo()
{
    const char* starr[] = {"ram", "mohan", "sita"};
    ListBox listBox;
    std::for_each(starr,
                  starr + sizeof(starr)/sizeof(char*),
                  std::bind2nd(std::ptr_fun(&listbox_add), listBox));

}
agupta666
quelle
0

mit C ++ 14:

#include <string>
#include <vector>


std::vector<std::string> listbox;
...
std::vector<std::string> strarr {"ram","mohan","sita"};    
for (const auto &str : strarr)
{
    listbox.push_back(str);
}
Äquistase
quelle
Kann man das nicht abkürzen for (const auto &str : {"ram","mohan","sita"} ) ...?
IntDattashame