包含头文件<initializer_list>
在标准库中的容器可以直接用等号的方式初始化容器→ 直接用等号赋值 { }
列表就是一个 { } 数据
一般情况下,如果想采用 { } 的方式初始化,类当中必须要有与之相匹配的参数的构造函数
提供了一个构造函数,用 initializer_list 当做构造函数的参数,就可以实现我们想要的效果(有几个参数都可以)
initializer_list 主要是用在构造函数当中,可以忽略参数的个数去做初始化(两个、三个、多个. . .)
#include <array>
#include <list>
#include <vector>
#include <iostream>
#include <initializer_list>
using namespace std;
class MM
{
public:
//如果类中只有一个这样的构造函数,意味着只能用3个字符串初始化
MM(string a, string b, string c) :a(a), b(b), c(c) {}
//显然标准库不是这样处理的 当然可以重载去做-> 如果参数过多呢? 同样无法处理
MM(string a, string b) :a(a), b(b) {}
//增加一个构造函数 initializer_list模板为参数 string类型 构造函数就可以采用1个参数、2个参数...而不是采用重载的方式
MM(const initializer_list<string>& list)
{
//内置迭代器
for (auto iter = list.begin(); iter != list.end(); iter++)
{
//打印数据
cout << *iter << endl;
}
}
protected:
string a;
string b;
string c;
};
void print(initializer_list<int> list)
{
for (auto iter = list.begin(); iter != list.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
}
int main()
{
//可以直接采用{}的方式初始化容器
array<int, 3> arrData = { 1,2,3 };
//vector没有长度限制-> 可以初始化多个
vector<int> vecData1 = { 1,2,3,4 };
vector<int> vecData2 = { 1,2,3,4,5 };
//必须这样写 没有办法做到vector的效果
MM mm1 = { "string1","string2","string3" };
//写两个是错误的-> 如果想这样做,就需要与之匹配的构造函数:需要准备一个两个参数的构造函数
MM mm2 = { "string1" };
//可以传一个参数、两个参数-> 只要是列表数据都可以直接用等号赋值 { }
MM mm3 = { "string1","string2" };
//直接创建一个对象
initializer_list<int> listOne = { 1,2,3,4,5 };
//可以存储多个数据 没有长度限制
initializer_list<int> listTwo = { 1,2,3 };
· //传入列表数据充当函数参数-> 传入多少个数据都可以打印
print({ 1 });
print({ 1,2 });
print({ 1,2,3,4 });
print({ 1,2,3,4,5 });
return 0;
}
/* 输出 */
string1
string2
string3
string1
string1
string2
1
1 2
1 2 3 4
1 2 3 4 5