能否初始化一个字符串向量数组?
例如:
static std::vector<std::string> v; //declared as a class member
我使用static
只是为了初始化并填充它的字符串。如果不能像普通数组那样进行初始化,我应该在构造函数中填充它吗?
现在是2023年,但这个帖子在我的搜索引擎中排名第一。今天,以下方法更受欢迎(初始化列表)。
std::vector<std::string> v = { "xyzzy", "plugh", "abracadabra" };
std::vector<std::string> v({ "xyzzy", "plugh", "abracadabra" });
std::vector<std::string> v{ "xyzzy", "plugh", "abracadabra" };
有点类似:
class some_class {
static std::vector<std::string> v; // declaration
};
const char *vinit[] = {"one", "two", "three"};
std::vector<std::string> some_class::v(vinit, end(vinit)); // definition
end
只是为了避免在后面长度变化时需要重复编写vinit+3
。请定义如下:
template<typename T, size_t N>
T * end(T (&ra)[N]) {
return ra + N;
}
sizeof(char*)
是4,那么是的。但在64位机器上就不一定了。我只是厌倦了每次迭代数组时都要输入一堆 sizeof
的东西。我的 end
函数对于数组的效果与 C++0x 中的 std::end
相同。 - Steve Jessopend
函数时,我指的是我的答案中的函数模板,与 C++0x 的 std::end
相对应。我并不声称发明了它! - Steve Jessopvinit
的类型const char* [3]
中推断出N
为3
。同样,T
也从相同的类型中推断出为const char *
。因此,编写end(vinit)
就像编写end<const char*, 3>(vinit)
一样,这要归功于模板参数推导。 - Steve Jessop如果你正在使用cpp11(如果需要,可以启用-std=c++0x
标志),那么你可以像这样简单地初始化向量:
如果您在使用cpp11(如有必要,请使用-std=c++0x
标志进行启用),则可以像这样简单初始化向量:
// static std::vector<std::string> v;
v = {"haha", "hehe"};
const char* args[] = {"01", "02", "03", "04"};
std::vector<std::string> v(args, args + 4);
在C++0x中,你可以利用std::initializer_list<>
:
由于MSVC 2010不支持使用std::initializer_list<>
来初始化向量,但它支持std::end
,以下是解决方案:
const char *args[] = {"hello", "world!"};
std::vector<std::string> v(args, std::end(args));
const char* args[] = {"01", "02", "03", "04"};
std::vector<std::string> v(args, args + sizeof(args)/sizeof(args[0])); //get array size
static
不会“填充字符串”,std::vector
是一种动态数据结构,创建时为空。 - Blastfurnace