C++ 使用硬编码元素初始化std::vector的最简单方法是什么?

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::

我希望创建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::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初始值设定项比在默认构造之后使用赋值更好。那么,对于感兴趣的读者来说,额外大括号的含义是什么呢?对于感兴趣的读者来说,这是省略外部大括号的一个非常好的解释。那么,额外大括号的含义是什么呢?对于感兴趣的读者来说,这是省略外部大括号的一个非常好的解释。