Comment pourrais-je convertir ce code en C++?
string[] strarr = {"ram","mohan","sita"};
foreach(string str in strarr) {
listbox.items.add(str);
}
std::array<std::string, 3> strarr = {"ram", "mohan", "sita"};
for(const std::string& str : strarr) {
listbox.items.add(str);
}
std::string strarr[] = {"ram", "mohan", "sita"};
for(int i = 0; i < 3; ++i) {
listbox.items.add(strarr[i]);
}
ou
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::array<std::string, 3> strarr = {"ram", "mohan", "sita"};
BOOST_FOREACH(std::string & str, strarr) {
listbox.items.add(str);
}
En C++ 0x vous avez
for(string str: strarr) { ... }
Mais jusque-là, utilisez ordinaire pour boucle.
Après m'être habitué au mot clé var
en C #, je commence à utiliser le mot clé auto
en C++ 11. Ils déterminent tous deux le type par inférence et sont utiles lorsque vous voulez simplement que le compilateur calcule le type pour vous. Voici le port C++ 11 de votre code:
#include <array>
#include <string>
using namespace std;
array<string, 3> strarr = {"ram", "mohan", "sita"};
for(auto str: strarr) {
listbox.items.add(str);
}
Boost a une macro qui le fera pour vous.
Juste pour le plaisir (nouvelles fonctions 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; } );
Bien que faire une simple boucle soit recommandé :-)
Quelque chose comme:
const char* strarr = {"ram","mohan","sita", 0L};
for(int i = 0; strarr[i]; ++i)
{
listbox.items.add(strarr[i]);
}
Fonctionne également pour le standard C. Pas sûr en C++ comment détecter la fin de la strarr sans avoir un élément null, mais ceci devrait fonctionner.
La forme simple:
std::string data[] = {"ram","mohan","sita"};
std::for_each(data,data+3,std::bind1st(std::mem_fun(&Y::add), &(listbox.items)));
Un exemple en 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)));
}
string [] strarr = {"ram", "mohan", "sita"};
#include <string>
std::string strarr = { "ram", "mohan", "sita" };
ou
const char* strarr[] = { "ram", "mohan", "sita" };
foreach (string str dans strarr) { listbox.items.add (str); }
for (int i = 0; i < sizeof strarr / sizeof *strarr; ++i)
listbox.items.add(strarr[i]);
Remarque: vous pouvez également placer les chaînes dans un std :: vector plutôt que dans un tableau:
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);
L'utilisation de boost est la meilleure option car elle vous aide à fournir un code net et concis, mais si vous souhaitez vous en tenir à la 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));
}
Si vous avez un tableau, vous pouvez simplement utiliser une boucle for
. (Je suis désolé, mais je ne vais pas taper le code d'une boucle for
pour vous.)
en utilisant 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);
}