使用举例: 以下两句是同样的含义:
std::vectorpayments({45.99, 39.23, 19.95, 89.01}); std::vector payments {45.99, 39.23, 19.95, 89.01};
--此语句将创建一个容器包含四个元素并用右侧的四个元素初始化容器。 为什么能使用初始化列表:定义了一个可以将初始化列表作为参数的构造函数。 一个小疑问:
std::vectorvi{10}; // ??这一句执行的是以下的哪一个 std::vector vi(10); // case A: 10 uninitialized elements std::vector vi({10}); // case B: 1 element set to 10
是caseB
std::vectorpayments {45.99, 39.23, 19, 89}; // same as std::vector payments {45.99, 39.23, 19.0, 89.0};
但是不允许缩窄变换:
std::vectorvalues = {10, 8, 5.5}; // narrowing, compile-time error
初始化列表的意义:除非要处理长度不同的列表,否则让容器接受初始化列表作为参数没有意义。
initializer_list objects定义头文件:initializer_list,可以包含该头文件直接使用初始化列表类 initializer_list类只有两个迭代器,一个指向列表开头,另一个指向列表结尾后一个位置,他们都是const类型
*dl.begin() = 2011.6; // not allowed
注意事项:不能修改初始化列表对象的元素,但是可以将一个初始化列表复制给另一个初始化列表。
代码
/*
Project name : _31initializer_list
Last modified Date: 2022年4月20日11点05分
Last Version: V1.0
Descriptions: 初始化列表
*/
/*
初始化列表:
使用举例:
以下两句是同样的含义:
std::vector payments({45.99, 39.23, 19.95, 89.01});
std::vector payments {45.99, 39.23, 19.95, 89.01};
--此语句将创建一个容器包含四个元素并用右侧的四个元素初始化容器。
为什么能使用初始化列表:
定义了一个可以将初始化列表作为参数的构造函数。
一个小疑问:
std::vector vi{10}; // ??这一句执行的是以下的哪一个
std::vector vi(10); // case A: 10 uninitialized elements
std::vector vi({10}); // case B: 1 element set to 10
是caseB
初始化列表的强制类型转换:
std::vector payments {45.99, 39.23, 19, 89};
// same as std::vector payments {45.99, 39.23, 19.0, 89.0};
但是不允许缩窄变换:
std::vector values = {10, 8, 5.5}; // narrowing, compile-time error
初始化列表的意义:除非要处理长度不同的列表,否则让容器接受初始化列表作为参数没有意义。
初始化列表类:
initializer_list objects定义头文件:initializer_list,可以包含该头文件直接使用初始化列表类
initializer_list类只有两个迭代器,一个指向列表开头,另一个指向列表结尾后一个位置,他们都是const类型
*dl.begin() = 2011.6; // not allowed
注意事项:不能修改初始化列表对象的元素,但是可以将一个初始化列表复制给另一个初始化列表。
*/
#include
#include
double sum(std::initializer_list il);
double average(const std::initializer_list& ril);
int main()
{
using std::cout;
cout << "List 1: sum = " << sum({ 2,3,4 })
<< ", ave = " << average({ 2,3,4 }) << '\n';
std::initializer_list dl = { 1.1, 2.2, 3.3, 4.4, 5.5 };
std::initializer_list d2 = dl;
cout << "List 2: sum = " << sum(dl)
<< ", ave = " << average(dl) << '\n';
cout << "List 2: sum = " << sum(d2)
<< ", ave = " << average(d2) << '\n';
dl = { 16.0, 25.0, 36.0, 40.0, 64.0 };
cout << "List 3: sum = " << sum(dl)
<< ", ave = " << average(dl) << '\n';
return 0;
}
double sum(std::initializer_list il)
{
double tot = 0;
for (auto p = il.begin(); p != il.end(); p++)
tot += *p;
return tot;
}
double average(const std::initializer_list& ril)
{
double tot = 0;
int n = ril.size();
double ave = 0.0;
if (n > 0)
{
for (auto p = ril.begin(); p != ril.end(); p++)
tot += *p;
ave = tot / n;
}
return ave;
}
运行结果
List 1: sum = 9, ave = 3 List 2: sum = 16.5, ave = 3.3 List 2: sum = 16.5, ave = 3.3 List 3: sum = 181, ave = 36.2 D:\Prj\_C++Self\_31initializer_list\x64\Debug\_31initializer_list.exe (进程 16096)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .