当前位置: 首页 > news >正文

【C++11】initializer_list详解!

一、什么是initializer_list?

nitializer_list 是一种C++11新的类型特性,它允许我们以统一的方式初始化对象。它是一个代表数组的轻量级包装器,通常用于构造函数函数参数中,以允许传递一个初始化元素列表。

  • initializer_list也是一种模板类型。
    template< class T >class initializer_list;

  • 该类模板中主要有三个方法:begin()end()迭代器以及获取区间中元素个数的方法size()

  • 保存的只是指向一个常量,无法对其修改

  • C++11允许构造函数和其他函数把初始化列表当做参数。

二、为什么要使用initializer_list?

1.需要传入不确定个数的实参时

#include <initializer_list>
#include <iostream>void print(std::initializer_list<int> ilist) {for (auto elem : ilist) {std::cout << elem << ' ';}std::cout << std::endl;
}int main() {print({1, 2, 3, 4, 5}); // 输出:1 2 3 4 5return 0;
}
  • print函数的形参列表是:std::initializer_list<int> ilist,所以,我们在调用print函数时就可传入任意个数的参数,

2.快速对STL容器进行初始化

对于STL的container的初始化就方便多了,比如以前初始化一个vector需要这样:

std::vector v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);

在c++11添加了initializer_list后,我们可以这样初始化

std::vector v = { 1, 2, 3, 4 };

3.多个对象的列表初始化

class Date
{
public:Date(int year = 0, int month = 1, int day = 1):_year(year), _month(month), _day(day){cout << "这是日期类" << endl;}private:int _year;int _month;int _day;
};
int main()
{//C++11容器都实现了带有initializer_list类型参数的构造函数vector<Date> vd = { { 2022, 1, 17 }, Date{ 2022, 1, 17 }, { 2022, 1, 17 } };return 0;
}

三、优缺点

优点

(1).统一初始化语法:使用 initializer_list,可以为不同的容器和对象类型提供统一的初始化语法。
(2).简化构造函数重载:可以用一个接受 initializer_list 参数的构造函数替代多个重载版本。
(3).支持范围 for 循环:initializer_list 支持基于范围的 for 循环,使得遍历元素变得非常简洁。

缺点

(1).只读:initializer_list 中的元素是只读的,你不能修改其中的元素。
(2).性能考虑:使用 initializer_list 可能涉及数组的复制,尤其是在传递给构造函数或函数时。
(3).生命周期:initializer_list 引用的元素数组的生命周期与 initializer_list 对象的生命周期相同,这可能导致悬垂引用的风险。

相关文章:

  • NSSCTF-Web题目14
  • 前端 JS 经典:通用性函数封装思路
  • 常见的创建型设计模式( 一 )
  • 数据结构之探索“队列”的奥秘
  • vue elementui table给表格中满足条件的每一条记录添加计时器
  • 低代码平台框架:开源选型、实践与应用深度解析
  • C++拷贝构造函数、运算符重载函数、赋值运算符重载函数、前置++和后置++重载等的介绍
  • ThreadLocal的原理
  • 深入浅出简单工厂模式及其在 Spring 框架中的应用
  • 【专业英语 复习】第9章 Privacy, Security,and Ethics
  • 【Flask】学习
  • 丰臣秀吉-读书笔记六
  • 沙奇里再造世界波,容声注定与经典结缘
  • 如何验证证书的合法性
  • MaxWell实时监控Mysql并把数据写入到Kafka主题中
  • JavaScript-如何实现克隆(clone)函数
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Angular6错误 Service: No provider for Renderer2
  • Mysql优化
  • Otto开发初探——微服务依赖管理新利器
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python打包系统简单入门
  • 缓存与缓冲
  • 如何在GitHub上创建个人博客
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 小程序 setData 学问多
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 与 ConTeXt MkIV 官方文档的接驳
  • 国内开源镜像站点
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)基于IDEA的JAVA基础12
  • (转载)深入super,看Python如何解决钻石继承难题
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET DataGridView数据绑定说明
  • .net6+aspose.words导出word并转pdf
  • .net程序集学习心得
  • .net分布式压力测试工具(Beetle.DT)
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET下的多线程编程—1-线程机制概述
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • []指针
  • [383] 赎金信 js
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [ACM] hdu 1201 18岁生日
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android]Tool-Systrace