Foreach-lus in C++-equivalent van C#

Hoe kan ik deze code converteren naar C++?

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

Antwoord 1, autoriteit 100%

bereik gebaseerd op:

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

pre c++11

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

of

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;
}

Boostgebruiken:

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

Antwoord 2, autoriteit 24%

In C++0x heb je

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

Maar gebruik tot die tijd gewone for-lus.


Antwoord 3, autoriteit 11%

Nadat ik gewend ben geraakt aan het sleutelwoord varin C#, begin ik het sleutelwoord autoin C++11 te gebruiken. Ze bepalen allebei het type per gevolgtrekking en zijn handig als je wilt dat de compiler het type voor je uitzoekt. Dit is de C++11-poort van je code:

#include <array>
#include <string>
using namespace std;
array<string, 3> strarr = {"ram", "mohan", "sita"};
for(auto str: strarr) {
  listbox.items.add(str);
}

Antwoord 4, autoriteit 4%

Boost heeft een macro die dit voor je doet.

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


Antwoord 5, autoriteit 4%

Gewoon voor de lol (nieuwe lambda-functies):

     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; } );

Hoewel het wordt aanbevolen om een eenvoudige lus te maken 🙂


Antwoord 6, autoriteit 2%

Zoiets als:

const char* strarr = {"ram","mohan","sita", 0L};
for(int i = 0; strarr[i]; ++i)
{
  listbox.items.add(strarr[i]);
}

Werkt ook voor standaard C. Ik weet niet zeker hoe je in C++ het einde van de strarr kunt detecteren zonder een null-element, maar het bovenstaande zou moeten werken.


Antwoord 7

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

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

of

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

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

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

Opmerking: je kunt de strings ook in een std::vector plaatsen in plaats van een array:

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);

Antwoord 8

De eenvoudige vorm:

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

Een voorbeeld in actie:

#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)));
}

Antwoord 9

Als u een array hebt, kunt u eenvoudig een forlus. (Het spijt me, maar ik ga de code niet typen voor een forlus voor u.)


Antwoord 10

Het gebruik van BOOST is de beste optie omdat het u helpt om een ​​nette en beknopte code te bieden, maar als u aan STL

wilt vasthouden

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));
}

Antwoord 11

Gebruik 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);
}

Other episodes