1. 程式人生 > >C++11 初始化列表(initializer_list)

C++11 初始化列表(initializer_list)

clu amp space return ret 列表 stl容器 int stat

C++11對原有的初始化列表(用花括號圍住的若幹個值)進行了大幅的擴展。以下寫法在C++11中都是被允許的:

 1 int static_arr[5] = {1, 2, 3, 4};  // static_arr[4] is not initialized here
 2 int static_arr2[] {1, 2, 3, 4};    // operator = can be omitted
 3 
 4 int* dynamic_arr = new int[5] {1, 2, 3, 4};  
 5 // dynamic_arr[4] is not initialized here
 6 
 7 vector<int> stl_vec {1, 2, 3, 4};
 8 set<int> stl_set {1, 2, 3, 3};
 9 cout << stl_set.size() << endl;    // 3
10 
11 map<const char*, int> stl_map {
12     {"Alice", 1},
13     {"Bob", 2},
14     {"Cindy", 3}
15 };

C++11將初始化列表解釋成一個initializer_list<T>類型的變量(T是列表中元素的類型)。它相當於一個只讀的容器,只有三個成員函數:size(),begin()和end()。

在上面這個例子中,我們用初始化列表為STL容器提供初值。C++11為STL容器新增了一種構造函數,它可以接收一個initializer_list。

initializer_list也可以像其他類型的變量一樣,在語句中被創建,或者用作函數(包括類的構造函數)的參數:

 1 #include <initializer_list> // This header is required
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 template <class Tp>
 7 void print_ilist(const initializer_list<Tp> &ilist)
 8 {
 9     for (auto it = ilist.begin(); it != ilist.end(); ++it)
10         cout << *it << endl;
11 }
12 
13 struct Foo
14 {
15     int vals[10];
16     int n = 0;
17     
18     Foo (const initializer_list<int> &ilist) {
19         for (int v: ilist)
20             vals[n++] = v;
21     }
22 };
23 
24 int main()
25 {
26     initializer_list<int> empty_ilist;
27     empty_ilist = {1, 2, 3, 4};
28     cout << empty_ilist.size() << endl;  // 4
29     
30     Foo foo {1, 2, 3};
31     Foo bar (empty_ilist);
32     cout << "bar.n = " << bar.n << endl; // 4
33     
34     initializer_list<float> float_ilist {1.0, 1.2, 1.5, 2.0};
35     print_ilist(float_ilist);
36     print_ilist( {"Reimu", "Marisa", "Sanae", "Reisen"} );
37     return 0;
38 }

C++11 初始化列表(initializer_list)