C++11新特性(2)- 列表初始化
以前什麼樣
C或者C++在初始化陣列時,可以使用下面的花括號加初始值的形式:
intint_array[]={1,2,3,4,5};
在C++中,如果有下面這樣一個類:
classTester
{
public:
Tester(intvalue)
:m_value(value*2)
{}
voidprint(){
cout<<m_value<<endl;
}
private:
intm_value;
};
那麼它的初始化可以寫成這樣:
Testertester_array[]={6,7,8,9,10};
Tester的建構函式可以被正常地呼叫。
存在的問題
問題就是這種方法的運用範圍很窄,許多場景都用不了。例如vector,可以像陣列一樣使用,可以自己管理資料長度,還提供各種運算元組的方法。宣告的方法也很簡單:
vector<int> int_vector;
但是有一個問題,當需要指定元素初始化vector時就不那麼方便了。
初始化方法1:
int_vector.push_back(5);
int_vector.push_back(4);
int_vector.push_back(3);
int_vector.push_back(2);
int_vector.push_back(1);
初始化方法二:
int int_array[] = {1, 2, 3, 4, 5};
for(int i = 0; i < sizeof(int_array)/sizeof(int_array[0]); ++i)
{
int_vector.push_back(int_vector[i]);
}
無論那種方法,都給人一種如鯁在喉的感覺。
哪裡有不方便,哪裡就有改進
C++11中擴充套件了使用花括號初始化變數的應用範圍,稱這種初始化方式為列表初始化。
例如:
可以像下面這樣初始化vector:
vector<int>int_vector={5,4,3,2,1};
可以像下面這樣初始化list:
list<int>int_list={5,4,3,2,1};
甚至可以像下面這樣初始化map
map<int,constchar*>id2Name={{1,"Zhang"},{2,"Wang"},{3,"Li"}};
另一種形式
下面和寫法也合法,和上面的幾種寫法等價。
vector
list<int>int_list{5,4,3,2,1};
map<int,constchar*>id2Name{{1,"Zhang"},{2,"Wang"},{3,"Li"}};
有沒有夢想成真的感覺?
拜託