2016-01-20 56 views
0

我希望創建一個MyClass的矢量,就像下面的課程類一樣。 我希望傳遞一個字符串數組作爲課程名稱。所以我寫使用硬編碼元素初始化std :: vector <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>’ 

爲什麼呢?如何做得更好?

+0

另一種選擇是'vector course_vector = {「Linux」,「C++」,「HTML」s};' –

+0

使用ctor-initializer作爲'name'優於默認構造,其次是賦值 –

回答

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

Live Demo

+0

,但向OP解釋爲什麼它對數組 – TemplateRex

+0

有效額外的大括號是什麼意思? –

+0

[這裏](http://stackoverflow.com/questions/11734861/when-can-outer-braces-be-omitted-in-an-initializer-list)對於感興趣的讀者省略外括號的確實很好的解釋。 – erip

2

添加下面的構造:

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

這樣一來,你就可以直接初始化向量,就像你想要的。

+0

那麼做還是做'vector course_vector = { 「Linux」,「C++」,「HTML」,「HTML5」};'如果他有一個編譯器'std :: string'支持 – PeterT

0

如果您使用的是C++ 11或以上你可以這樣做

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