【发布时间】:2011-04-08 14:47:38
【问题描述】:
如何将此代码转换为 C++?
string[] strarr = {"ram","mohan","sita"};
foreach(string str in strarr) {
listbox.items.add(str);
}
【问题讨论】:
如何将此代码转换为 C++?
string[] strarr = {"ram","mohan","sita"};
foreach(string str in strarr) {
listbox.items.add(str);
}
【问题讨论】:
如果你有一个数组,你可以简单地使用for 循环。 (很抱歉,我不会为您输入 for 循环的代码。)
【讨论】:
在 C++0x 中你有
for(string str: strarr) { ... }
但在那之前使用普通的for循环。
【讨论】:
Boost 有一个宏可以为您执行此操作。
【讨论】:
类似:
const char* strarr = {"ram","mohan","sita", 0L};
for(int i = 0; strarr[i]; ++i)
{
listbox.items.add(strarr[i]);
}
也适用于标准 C。不确定在 C++ 中如何在没有 null 元素的情况下检测 strarr 的结尾,但上述方法应该可以。
【讨论】:
sizeof(strarr)/sizeof(strarr[0])会得到数组中的元素个数;然而,如果它是一个动态分配的数组(或者如果你只有一个指针),那么就没有办法获得它的大小——你必须通过其他一些带外方式来获得它。
std::size_t。
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]);
}
或
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);
}
【讨论】:
std::for_each的看法。
for(int i = 0; i < sizeof(strarr)/sizeof(strarr[0]); i++) 等数组的大小如何?
字符串[] strarr = {"ram","mohan","sita"};
#include <string>
std::string strarr = { "ram", "mohan", "sita" };
或
const char* strarr[] = { "ram", "mohan", "sita" };
foreach(str 中的字符串 str) { listbox.items.add(str); }
for (int i = 0; i < sizeof strarr / sizeof *strarr; ++i)
listbox.items.add(strarr[i]);
注意:您也可以将字符串放入 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);
【讨论】:
只是为了好玩(新的 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; } );
虽然建议做一个简单的循环:-)
【讨论】:
使用 boost 是最好的选择,因为它可以帮助您提供简洁的代码,但如果您想坚持使用 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));
}
【讨论】:
简单的形式:
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# 中的 var 关键字之后,我开始在 C++11 中使用 auto 关键字。它们都通过推断确定类型,并且在您只希望编译器为您找出类型时很有用。这是您的代码的 C++11 端口:
#include <array>
#include <string>
using namespace std;
array<string, 3> strarr = {"ram", "mohan", "sita"};
for(auto str: strarr) {
listbox.items.add(str);
}
【讨论】:
使用 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);
}
【讨论】:
for (const auto &str : {"ram","mohan","sita"} ) ...吗?