Foreach循环在C ++中相当于C#

我将如何将此代码转换为C ++?

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

单独使用标准库:

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

要么

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

使用Boost :

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

C ++ 11 :

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

在C ++ 0x你有

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

但直到那时使用普通的循环。

习惯了C#中的var关键字后,我开始在C ++ 11中使用auto关键字。 它们都通过推断来确定types,并且在您只是希望编译器为您确定types时非常有用。 以下是代码的C ++ 11端口:

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

Boost有一个macros将为你做这个。

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

只是为了好玩(新的lambda函数):

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

虽然build议做一个简单的循环:-)

就像是:

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

也适用于标准C.不知道在C ++中如何检测strarr的结束没有null元素,但上述应该工作。

如果你有一个数组,你可以简单地使用for循环。 (对不起,我不打算为你的循环input代码。)

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

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

要么

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

foreach(stringstr在strarr){listbox.items.add(str); }

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

注意:你也可以把string放到一个std :: vector而不是一个数组中:

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

使用boost是最好的select,因为它可以帮助你提供一个简洁明了的代码,但是如果你想坚持STL

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

简单的forms:

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

行动中的一个例子:

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

使用C ++ 14:

 #include <string> #include <vector> std::vector<std::string> listbox; ... std::vector<std::string> strarr {"ram","mohan","sita"}; foreach(const auto &str : strarr) { listbox.push_back(str); }