本文主要是介绍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++通用的类型,大多数类型的对象在传递给省略符形参时都无法正确拷贝。
这篇关于c++11中的初始化列表类initializer_list的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!