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时,应该在它持有对象的生存期结束之前完成传递。