C++98 初始化容器需多次 push_back:
std::vector<int> v;
v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4);
C++11 std::initializer_list 支持列表初始化:
std::vector<int> v = {1, 2, 3, 4}; // 優雅、高效
{...} 構造為臨時數組,傳遞 initializer_list 引用begin()、end()、size(),可範圍 for 遍歷
#include <iostream>
#include <vector>
class MyNumber {
std::vector<int> mVec;
public:
MyNumber(const std::initializer_list<int>& v) {
for (auto item : v) mVec.push_back(item);
}
void print() {
for (auto item : mVec) std::cout << item << " ";
std::cout << "\n";
}
};
int main() {
MyNumber m = {1, 2, 3, 4}; // 調用 initializer_list 構造函數
m.print(); // 1 2 3 4
return 0;
}
class CompareClass {
public:
CompareClass(int, int) { std::cout << "普通構造函數\n"; }
CompareClass(std::initializer_list<int>) { std::cout << "initializer_list 構造函數\n"; }
};
int main() {
CompareClass foo{10, 20}; // 調用 initializer_list 構造函數
CompareClass bar(10, 20); // 調用普通構造函數
return 0;
}
規則: 列表初始化 {} 優先匹配 initializer_list 構造函數;括號初始化 () 正常匹配參數列表。
vector v = {1,2,3}; void func(std::initializer_list list); func({1,2,3}); v = {4,5,6};(C++11 容器支持)for (int x : {1,2,3}) ...initializer_list 元素為 const,不可修改vector v = {1.5}; 報錯(C++11 縮窄檢查)auto x = {1,2,3}; 推導為 std::initializer_list