C++11 初始化列表(initializer_list)
阿新 • • 發佈:2017-08-01
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)