用硬编码元素初始化std :: vector <MyClass>的最简单方法是什么?

Shi*_* Xu 1 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::id_generator = 0;
Run Code Online (Sandbox Code Playgroud)

这有效

string course_names[] = {"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"};
vector<Course> course_vector(begin(course_names), end(course_names));
Run Code Online (Sandbox Code Playgroud)

但这不是

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>’
Run Code Online (Sandbox Code Playgroud)

为什么?怎么做更好?

101*_*010 5

用于将聚合类型作为数组的聚合初始化:

string course_names[] = {"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"};
Run Code Online (Sandbox Code Playgroud)

initializer_list初始化不同。std::vector提供了一个带有的构造函数,std::initializer_list<T>当您尝试vector使用花括号初始化a时,该构造函数就会被调用。为了使其正常工作,您需要为每个元素添加大括号:

std::vector<Course> course_vector = {{"Linux"}, 
                                     {"C++"},
                                     {"HTML"},
                                     {"HTML5"},
                                     {"NodeJS"},
                                     {"Shell"},
                                     {"Python"}};
Run Code Online (Sandbox Code Playgroud)

另外,将您的构造函数更改为:

Course::Course(std::string const &s) : id(id_generator++),  name(s) { }
Run Code Online (Sandbox Code Playgroud)

现场演示