c++11中的std::initializer_list模板类

文章介绍了C++11中std::initializer_list的作用,包括作为轻量级容器存储连续元素,用于函数参数传递,初始化自定义类型对象,以及作为初始值设定项列表构造函数的特性。此外,还提到C++11如何优化STL容器的初始化过程。
摘要由CSDN通过智能技术生成

c++11中的std::initializer_list模板类

std::initializer_list 是 C++11 引入的一个模板类,它允许你使用花括号初始化语法来初始化对象。这在你需要创建一个集合(如数组、向量或自定义类型的集合)时特别有用。

此类型的对象由编译器根据初始化列表声明自动构造,该声明是用大括号括起来的逗号分隔元素的列表,类型是:const T,初始化列表如下

{10, 20, 30}

接下来通过一段代码验证该类型

#include<iostream>
using namespace std;

int main()
{
	// the type of il is an initializer_list
	auto il = { 10, 20, 30 };
	cout << typeid(il).name() << endl;
	return 0;
}

在这里插入图片描述

一,std::initializer_list 是一个轻量级的容器,它包含了一系列的元素,并且这些元素在初始化列表中是连续的。

对象是自动构造的,就好像分配了一个类型的元素数组一样,列表中的每个元素都使用任何必要的非缩小隐式转换复制初始化为数组中的相应元素。

二,std::initializer_list 通常作为函数的参数,允许你传递一个初始化列表给该函数。

下面是一个简单的列子

#include <iostream>  
#include <vector>  
#include <initializer_list>  
  
void printVector(const std::initializer_list<int>& list) {  
    for (auto it = list.begin(); it != list.end(); ++it) {  
        std::cout << *it << " ";  
    }  
    std::cout << std::endl;  
}  
  
int main() {  
    printVector({1, 2, 3, 4, 5});  
    return 0;  
}

在这里插入图片描述
在上面的代码中,我们定义了一个函数 printVector,它接受一个 std::initializer_list 类型的参数。在 main 函数中,我们使用花括号初始化语法来创建一个整数列表,并将其传递给 printVector 函数。

三,也可以使用 std::initializer_list 来初始化自定义类型的对象

#include <iostream>  
#include <initializer_list>  
  
class MyClass {  
public:  
    MyClass(std::initializer_list<int> list) {  
        for (auto it = list.begin(); it != list.end(); ++it) {  
            std::cout << *it << " ";  
        }  
        std::cout << std::endl;  
    }  
};  
  
int main() {  
    MyClass obj{1, 2, 3, 4, 5};  
    return 0;  
}

在这里插入图片描述
在这个例子中,我们定义了一个 MyClass 类,它有一个接受 std::initializer_list 参数的构造函数。在 main 函数中,我们使用花括号初始化语法来创建一个 MyClass 对象,并传递一个整数列表给构造函数。

四,此外仅采用一个std::initializer_list作为类参数的构造函数是一种特殊类型的构造函数,称为初始值设定项列表构造函数。使用初始值设定项列表构造函数语法时,初始值设定项列表构造函数优先于其他构造函数

struct myclass {
  myclass (int,int);
  myclass (initializer_list<int>);
  /* definitions ... */
};

myclass foo {10,20};  // calls initializer_list ctor
myclass bar (10,20);  // calls first constructor 

上图代码中{10,20}整体作为一个类参数的构造函数优先构造执行,而(10,20)作为两个参数传入的构造函数后构造执行。

五,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。

如下列
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

int main()
{
	vector<int> v{ 1,2,3,4 };
	list<int> lt{ 1,2 };
	
	// 这里{"sort", "排序"}会先初始化构造一个pair对象
	map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
	// 使用大括号对容器赋值
	v = {10, 20, 30};
}```


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值