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時,應該在它持有對象的生存期結束之前完成傳遞。

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