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

时间:2016-01-20 11:20:55

标签: c++ initialization

我希望创建一个MyClass的向量,就像下面的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>’

为什么呢?怎么做得更好?

3 个答案:

答案 0 :(得分:4)

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

string course_names[] = {"Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python"};

initializer_list初始化不同。 std::vector提供了一个构造函数,它接收std::initializer_list<T>,并且当您尝试使用大括号初始化vector时调用的构造函数。为了使其正常工作,您需要为每个元素添加额外的大括号:

std::vector<Course> course_vector = {{"Linux"}, 
                                     {"C++"},
                                     {"HTML"},
                                     {"HTML5"},
                                     {"NodeJS"},
                                     {"Shell"},
                                     {"Python"}};

另外,我最好将构造函数更改为:

Course::Course(std::string const &s) : id(id_generator++),  name(s) { }

http://prntscr.com/9sgq7x

答案 1 :(得分:2)

添加以下构造函数:

Course::Course(const char *s) : name(s) {
    id = id_generator++;
}

这样,您就可以直接初始化矢量,就像您想要的那样。

答案 2 :(得分:0)

如果您使用的是c ++ 11或更高版本,则可以执行此类操作

std::vector<Course> vec = {Course("course1"), Course("course2"), Course("course3")};