c++11中的std::initialzer_list

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章