c++11中的初始化列表类initializer_list

定义

initializer_list 定义在同名头文件中,initializer_list是一个标准库模板类型,用于表示某种特定类型的值的数组,这里不得不提下和vector的不同:initializer_list对象中的元素永远是常量值,无法改变;其次,initializer_list的拷贝和赋值不会拷贝列表中的元素,而是共享元素。

initializer_list提供的操作

  • initializer_list lst; 默认初始化:T类型元素的空列表
  • initializer_list lst{a, b, c,…}; lst的元素和初始值一样多,lst的元素是对应初始值的副本,列表中的元素是const的
  • lst2(lst); //拷贝或赋值一个initializer_list 对象不会拷贝列表中的元素,而是共享元素
  • lst2 = lst;
  • lst.size(); 返回列表中的元素格式
  • lst.begin(); 返回指向lst中首元素的指针,不是迭代器。
  • lst.end(); //返回指向lst中尾元素的下一个元素的指针

示例

#include <iostream>
#include <initializer_list>
using namespace std;

int main()
{
	initializer_list<int> a{1, 2, 3};	//使用列表初始化来初始化initializer_list<int> 对象a, 该对象只存储int类型的值
	for (auto it = a.begin(); it != a.end(); it++)
	{
		//是否能改变
		//*it = 5;	//无法通过编译:不能给常量赋值
		cout << "地址:" << it << "	值:" << *it << endl;
	}
	cout << "---------------------------------------\n";
	cout << endl;
	initializer_list<int> b(a);	//拷贝构造
	//查看地址是否相同
	for (auto it = b.begin(); it != b.end(); it++)
	{
		cout << "地址:" << it << "	值:" << *it << endl;
	}
	return 0;
}

结果如下:
在这里插入图片描述
发现地址是一样的,说明的确是共享内存的。

initializer_list 一般用作可变参数,说到可变参数,可以补充认识一下用省略号(…)表示可变参数

省略发可变长度形参(…)

省略发形参只能出现在形参列表中的最后一个位置,例:

void func(int a, ...);
void func2(...);

和initializer_list 的区别是,省略符形参可以包含不同类型的值,例:

func(1, 3.14, "str");	//可变参数列表包含两个类型参数,一个是double, 一个是string

需要注意的是:省略符形参应该仅仅适用于C和C++通用的类型,大多数类型的对象在传递给省略符形参时都无法正确拷贝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值