initializer_list、初始化列表、列表初始化


什么是列表初始化

使用一個花括號來初始化變量,表現形式如下:

std::vector<int>a{1,2,3,4,5};

或者

std::vector<int>a = {1,2,3,4,5};

這里用到了一個新的類型,即initializer_list,包含在標准庫頭文件中。

優點

  1. 在C++11以前,如果要初始化一個vector,需要這樣做
std::vector<int>a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);

很明顯,使用列表初始化使得代碼量少了很多,也更加的簡潔優雅。
2. 這種方式不僅僅可以用在STL中,也可以用於一般的內置類型。

int c{3};
int c = {3};

乍一看,這樣做沒什么優點,並沒有變得更簡潔,甚至還要多寫兩個花括號。但在CppCoreGuideline中,非常推薦這種寫法。原因是有一個類型檢查

int c = 3.3; //這里會進行默認類型轉換
int b = {3.3}; //這里編譯器會給出警告(也有可能是錯誤)

理論上,這樣的代碼更加健壯。

自定義類型使用initializer_list

c++11也提供了方法,讓用戶可以在自定義類型(一般指類)中使用初始化列表。

#include <iostream>
#include <vector>

class Num
{
  private:
    std::vector<int> vv;
  public:

    Num(const std::initializer_list<int> &v)
    {
        for (auto a : v)
        {
            vv.push_back(a);
        }
    }

    void PrintNum(void)
    {
        for (auto v : vv)
        {
            std::cout << v << " ";
        }
        std::cout << std::endl;
    }
};

int main(int argc, char **argv)
{
    Num n{1, 2, 3, 4};
    n.PrintNum();

    return 0;
}

實現方法,簡單來說,就是加入initializer_list類型來實現構造函數,在新建對象時,就可以使用列表初始化的方式了。

一個特殊用法

在使用python的時候,有時候會這樣操作

for i in [1,2,3]:
    print(i)

看起來很簡潔優雅,c++其實也有這種操作

#include <iostream>

int main(int argc, char **argv)
{
    for(auto n : {1,2,3,4,5,6})
    {
        std::cout<<n<<std::endl;
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM