How would I convert this code to C++?

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

11 Answers

ranged based for:

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

or

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

Using Boost:

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

In C++0x you have

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

But till then use ordinary for loop.

After getting used to the var keyword in C#, I'm starting to use the auto keyword in C++11. They both determine type by inference and are useful when you just want the compiler to figure out the type for you. Here's the C++11 port of your code:

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

Boost has a macro that will do this for you.

2

Just for fun (new lambda functions):

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

Although doing a simple loop is recommended :-)

Something like:

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

Also works for standard C. Not sure in C++ how to detect the end of the strarr without having a null element, but the above should work.

2

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

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

or

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

Note: you can also put the strings into a std::vector rather than an 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); 

The simple form:

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

An example in action:

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

If you have an array you can simply use a for loop. (I'm sorry, but I'm not going to type out the code for a for loop for you.)

0

Using boost is the best option as it helps you to provide a neat and concise code, but if you want to stick to 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)); } 

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy