C++11 initializer_list(列表初始化容器 {}初始化)

不知道大家知不知道Java的可变参数列表(即函数形参使用 类型。。。类型名  这样的写法),这样写的好处就是写函数的时候参数的个数是可以变化的。

当然C语言中也提供了。。。,比如我们熟知的printf,scanf就是使用。。。完成的,但为什么已经有了。。。,还需要 initializer_list呢?

其实printf和scanf有一个共同点大家有没有发现,那就是第一个参数为格式化字符串,而C语言的。。。必须要通过第一个参数来获取后面参数的个数,而scanf()和printf()就是通过字符串中的格式控制符来确定后方参数个数的。

但万一有些人就是不守这个规矩呢?前面第一个参数就说后面有4个参数,但调用的时候后面却只跟2个参数,就跟你去银行取钱,明明账户上只有三块五,你非要取出个几万块?可能吗,难不成你还抢银行,去特殊机构体验个十年八年的,岂不美哉?那么如果是程序,会发生什么问题?肯定得报错啊,不信的话你可以用printf或scanf试试(专治各种不服=.=)

于是,initializer_list也就应运而生了!

nitializer_list是一个模板类,可能你已经用过它了但不知道而已,比如下面的代码就用了:

#include<iostream>
#include<vector>
using namespace std;
int main() {
	vector<int> vc({ 1,2,3,4 });	//这里调用了构造函数,实参为{1,2,3,4}
	return 0;
}

只要你在函数调用的时候使用{},就会创建一个initializer_list的临时对象,用来构造vector

但用别人的总有点不舒服,写自己的才是最开心的,对吧=.=

initializer_list类成员:

首位迭代器:begin()end()

长度:size()

演示:

#include<iostream>
using namespace std;
void print(initializer_list<int> list) {
	for (auto it = list.begin(); it != list.end(); ++it)
		cout << *it << " ";
	cout << endl;
}
int main() {
	print({ 1,2,3,4,5,6,7 });
	return 0;
}

于是我们很成功的完成了一个参数可变长的print函数=.=,但你会发现这些参数必须是同种类型,能不能换成不同类型的,答案是:可以!只需把initializer_list的模板参数类型换成any(any:博客:https://blog.csdn.net/qq_40946921/article/details/90646022),就可以了,但由于any获取值仍需要确定值类型,所以目前来说这个方法除了把简单问题复杂化之外,并没有一点用(亲测)

  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值