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

标签 c++ initialization

我希望创建一个 MyClass 的 vector ,如以下 Course 类。 我希望传递一个字符串数组作为类(class)名称。所以我写

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

为什么?如何做得更好?

最佳答案

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

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) { }

Live Demo

关于c++ - 使用硬编码元素初始化 std::vector<MyClass> 的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34898633/

相关文章:

c++ - 如何在继承类上初始化静态变量?

c++ - C++ 中是否存在未初始化的对象?

c++ - 跳过 C++ 中的置换元素

c++ - 如何在应用程序一开始就破坏堆栈

c++ 自动覆盖有符号/无符号

ios - 扩展 UIAlertController 便利初始化警告

c++ - 如何使类成员变量与函数模板的返回类型相同?

c++ - boost::shared_array 和对齐的内存分配

c++ - 初始化 3d vector c++

arrays - Julia 初始化数组/向量不是零而是随机