c++11中的stl容器擁有和未顯示指定長度的數組一樣的初始化能力。其初始化列表長度可以是任意的。
std::initialzer_list這一輕量級類模版提供了上述功能的支持。
例如可以使用std::initialzer_list定義自己的容器:
class MyVector{
std::vector<int> content_;
public:
MyVector(std::initializer_list<int> list){
for(auto it = list.begin();it!=list.end();it++){
content_.push_back(*it);
}
}
std::vector<int> getData();
};
std::vector<int> MyVector::getData() {
return content_;
}
std::initializer_list有三個成員接口:size()、begin()、end();
對std::initializer_list的遍歷只能通過begin()和end()進行循環遍歷,而且只讀不能改變,要想改變其中的元素值,只能整體重新初始化賦值。
std::initializer_list相比vector等容器是高效的。因爲std::initializer_list保存的是初始化列表中元素的引用,而vector等容器則是對初始化列表中的元素進行了拷貝。
如:
std::initializer_list<int> fun(){
int a=12,b=1;
return {a,b};
}
std::vector<int> func1(){
int a=13,b=14;
return {a,b};
}
func()函數無法傳遞我們希望的結果,因爲a,b在函數結束時,生存期也結束了,返回內容將會不確定。
但是func1()函數返回的是a,b值的拷貝,所以可以返回期望的值。
因此,使用std::initializer_list時,應該在它持有對象的生存期結束之前完成傳遞。