【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 对象的生命周期相同,这可能导致悬垂引用的风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/859649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C#基础】C#中的IEnumerable<T>接口介绍

文章目录 前言一、关于 IEnumerable<T> 接口的一些关键点1、定义2、使用3、LINQ支持4、自定义实现5、线程安全6、延迟执行 二、C#中的IEnumerable<T>接口的扩展介绍1、接口定义与基础2、使用场景3、扩展方法4、延迟执行5、自定义实现6、线程安全7、性能考虑 前言 …

GWB—200JA型引伸计标定器

GWB一200JA型引伸计标定器&#xff0c;是一种纯机械式的高精度位移测微仪器。依据JJG762—2007引伸计检定规程要求&#xff0c;专门用于对各类引伸计的标定&#xff0c;也广泛用于位移传感器的检定及相应百分表、千分表的标定。 l、本仪器由精密微分测头及测量支架组成。该标定…

List<Point>实现深拷贝的一种简单方法

在C#中&#xff0c;列表&#xff08;List&#xff09;的赋值如您所示是浅拷贝&#xff0c;即两个列表将引用相同的底层数组。要实现深拷贝&#xff0c;您需要手动遍历列表并为每个元素创建一个新的副本。对于Point这样的结构体&#xff0c;直接赋值会自然地创建一个副本&#x…

vue2+webpack 和 vite+vue3 配置获取环境变量(补充)

相关涉及知识点可看小编该文章&#xff1a; nginx: 部署前端项目的详细步骤&#xff08;vue项目build打包nginx部署&#xff09;_前端工程打包部署到nginx-CSDN博客 1.vue2webpack 我们通常会在项目中看到这么两个文件(没有则自己创建&#xff0c;文件名&#xff1a;.env.***) …

C#回车按下时 如果当前焦点的下个控件为Button 则按Button。 如果不是Button则焦点移到下个控件上

需求 扫SN 扫IMEI 扫其它 就自动点打印 帮我写这个C# 函数 “ private void FormF360ColorBox_KeyDown(object sender, KeyEventArgs e)” 回车按下时 如果当前焦点的下个控件为Button 则按Button。 如果不是Button则焦点移到下个控件上。 控件的Index 顺序要设对哦。 你可以…

AI大模型战争:通用与垂直,谁将领跑未来?

文章目录 &#x1f4d1;引言一、通用大模型&#xff1a;广泛适用&#xff0c;实力不容小觑1.1 强大的泛化能力1.2 广泛的适用场景 二、垂直大模型&#xff1a;专注深度&#xff0c;精准解决问题2.1 深度专注&#xff0c;精准度高2.2 快速落地与普及 三、通用与垂直&#xff1a;…

通过焦点行事件对行值抓取改变当行状态值

我们在实际开发过程中&#xff0c;对于每一行的状态值需要有单独的变换&#xff0c;通过对特定值的判断我们可以改变其状态值&#xff0c;通过状态值的不同&#xff0c;允许用户进行不同的操作&#xff0c;本文状态值以审核为例&#xff0c;通过对AuditState列的判断&#xff0…

新建的springboot项目启动报错:找不到或无法加载主类

检查编译问题 在使用Spring Boot时&#xff0c;我们通常使用Maven或Gradle进行项目的构建和编译。如果在编译过程中出现了错误&#xff0c;可能会导致无法加载主类的问题。 在使用Maven时&#xff0c;可以尝试使用 mvn clean install 命令清理并重新构建项目。 如果使用Grad…

qt开发-12_QScrollArea

在 Qt 中&#xff0c;QScrollArea 是用于显示可以滚动内容的控件&#xff0c;通常用于处理视图中内容超出可见区域的情况。它提供了一种在有限的视窗内显示大量内容的解决方案&#xff0c;如显示大图像、长文本、多个小部件等。 常用方法和属性 setWidget(QWidget *widget)&am…

泰勒斯威夫特2022年纽约大学毕业典礼演讲:NYU‘s 2022 Commencement Speaker Taylor Swift

NYU’s 2022 Commencement Speaker Taylor Swift Link: https://www.youtube.com/watch?vOBG50aoUwlI Singer, songwriter, producer, and director Taylor Swift received a Doctor of Fine Arts, honoris causa, at the Commencement for the Class of 2022 and delivered …

RecyclerVIew->加速再减速的RecyclerVIew平滑对齐工具类SnapHelper

XML文件 ItemView的XML文件R.layout.shape_item_view <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"100dp"android:layout_heig…

一加12搞机(kernelsu+lsposed)

刷机 温馨提示&#xff1a;如果你不知道root的意义在哪&#xff0c;建议不要解锁和root&#xff0c;到时候救砖或者回锁都挺麻烦。 刷全量包 最新版的系统没有更新推送&#xff0c;所以去一加社区[0]找了个全量包来刷&#xff0c;。安装方式可以看帖子里的内容&#xff0c;说…

NodeJs 速通

前言&#xff1a;参考 Node.js 中文网&#xff0c;可以通过 Node.Js V19 API 文档查看常用 API 。 番外 番外知识点&#xff0c;多学点总没坏处 &#x1f600;&#x1f600;&#x1f600;。 1. 计算机的基本组成 计算机由 CUP、内存、硬盘、显卡、主板、散热器 等组成。 1…

力扣-滑动窗口

文章目录 滑动窗口题目1-无重复字符的最长子串题目2-找到字符串中所有字母异位词 滑动窗口 滑动窗口是一种常用的算法技巧&#xff0c;适用于需要在一个数组或字符串中找出满足特定条件的连续子数组或子字符串的问题。它通过维护一个窗口范围来减少重复计算&#xff0c;从而优…

计算机硬件的组成与功能详解

目录 1. 组成要素 2. 运算器 运算器的组成 运算器的运作方式 3. 存储器 1. 随机存取存储器&#xff08;RAM, Random Access Memory&#xff09; 2. 只读存储器&#xff08;ROM, Read-Only Memory&#xff09; 3. 缓存&#xff08;Cache&#xff09; 4. 辅助存储器&…

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据…

【EF Core】两种使用模式(Code First、Database First)

文章目录 Code FirstDatabase FirstCode First 示例安装 Entity Framework Core创建模型创建数据库创建、读取、更新和删除 Database First 示例1. 使用Scaffold-DbContext命令生成代码&#xff08;通常在Package Manager Console中执行&#xff09;2. 生成的代码类似于Code Fi…

金融行业专题|某头部期货基于 K8s 原生存储构建自服务数据库云平台

为了进一步提升资源交付效率&#xff0c;不少用户都将数据库应用从物理环境迁移到容器环境。而对于 Kubernetes 部署环境&#xff0c;用户不仅需要考虑数据库在性能方面的需求&#xff0c;还要为数据存储提供更安全、可靠的高可用保障。 近期&#xff0c;某头部期货机构基于 S…

新手摄影技巧总结

拍摄好看的照片不仅仅依赖于相机的硬件配置&#xff0c;还需要掌握一些基本的摄影技巧和相机设置。以下是一些建议&#xff0c;帮助你利用佳能EOS R62拍出更好看的照片&#xff1a; 1. 了解相机设置 模式选择&#xff1a;学习使用不同的拍摄模式&#xff08;如光圈优先、快门…

PaddleOCR C++源码编译以及demo测试

Windows10下使用PaddleOCRc 1.所需要的环境 PaddleOCR 源码文件&#xff1a;https://gitee.com/paddlepaddle/PaddleOCR &#xff08;本文选择2.6https://github.com/PaddlePaddle/PaddleOCR/archive/refs/tags/v2.6.0.zip&#xff09; opencv库&#xff1a;https://opencv…