C++ 使用硬编码元素初始化std::vector的最简单方法是什么?
我希望创建MyClass的向量,就像下面的课程类一样。 我希望传递一个字符串数组作为课程名称。所以我写C++ 使用硬编码元素初始化std::vector的最简单方法是什么?,c++,initialization,C++,Initialization,我希望创建MyClass的向量,就像下面的课程类一样。 我希望传递一个字符串数组作为课程名称。所以我写 struct Course { int id; string name; static int id_generator; Course() {} Course(string s); }; Course::Course(string s) { name = s; id = id_generator++; } int Course::
struct Course {
int id;
string name;
static int id_generator;
Course() {}
Course(string s);
};
Course::Course(string s) {
name = s;
id = id_generator++;
}
int Course::id_generator = 0;
这很有效
string course_names[] = {"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"};
vector<Course> course_vector(begin(course_names), end(course_names));
但事实并非如此
vector<Course> course_vector = {"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"};
error: could not convert ‘{"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<Course>’
为什么??如何做得更好?添加以下构造函数:
Course::Course(const char *s) : name(s) {
id = id_generator++;
}
这样,您就可以直接初始化向量,就像您想要的那样。添加以下构造函数:
Course::Course(const char *s) : name(s) {
id = id_generator++;
}
这样,您就可以直接初始化向量,就像您想要的那样。用于聚合类型作为数组的聚合初始化:
string course_names[] = {"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"};
与初始化器列表初始化不同。vector提供了一个接受std::initializer_列表的构造函数,当您尝试用大括号初始化向量时,会调用该构造函数。要使其正常工作,每个图元都需要额外的支架:
std::vector<Course> course_vector = {{"Linux"},
{"C++"},
{"HTML"},
{"HTML5"},
{"NodeJS"},
{"Shell"},
{"Python"}};
用于聚合类型作为数组的聚合初始化:
string course_names[] = {"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"};
与初始化器列表初始化不同。vector提供了一个接受std::initializer_列表的构造函数,当您尝试用大括号初始化向量时,会调用该构造函数。要使其正常工作,每个图元都需要额外的支架:
std::vector<Course> course_vector = {{"Linux"},
{"C++"},
{"HTML"},
{"HTML5"},
{"NodeJS"},
{"Shell"},
{"Python"}};
如果您使用的是c++11或更高版本,您可以这样做
std::vector<Course> vec = {Course("course1"), Course("course2"), Course("course3")};
如果您使用的是c++11或更高版本,您可以这样做
std::vector<Course> vec = {Course("course1"), Course("course2"), Course("course3")};
或者做向量课程u vector={Linuxs,C++s,HTMLs,HTML5s};如果他有一个支持std::string literal的编译器,那么他也可以做vector course_vector={Linuxs,C++s,HTMLs,HTML5s};如果他有一个带std::string literal支持的编译器,另一个选项是vector course_vector={Linuxs,C++s,HTMLs};使用ctor初始值设定项作为名称优于默认构造,然后是赋值另一个选项是vector course_vector={Linuxs,C++s,HTMLs};对名称使用ctor初始值设定项比在默认构造之后使用赋值更好。那么,对于感兴趣的读者来说,额外大括号的含义是什么呢?对于感兴趣的读者来说,这是省略外部大括号的一个非常好的解释。那么,额外大括号的含义是什么呢?对于感兴趣的读者来说,这是省略外部大括号的一个非常好的解释。