c++initializer_list详解

`计算机知识` `C++` initializer_list初始化列表, 括号列表初始化, 括号集合 1 阅读详情
AI摘要

本文介绍了C++11中的initializer_list特性,探讨了列表初始化的使用,并展示了如何利用initializer_list来简化容器如vector的初始化过程。同时,通过实例说明了initializer_list的基本操作及注意事项。

initializer_list是C++11提供的新类型,定义在头文件中。
用于表示某种特定类型的值的数组,和vector一样,initializer_list也是一种模板类型。

template< class T >
class initializer_list;

要介绍initializer_list的使用,有必要先谈一谈列表初始化。

C++11扩大了初始化列表的适用范围,使其可用于所有内置类型和用户定义的类型。无论是初始化对象还是某些时候为对象赋新值,都可以使用这样一组由花括号括起来的初始值了。使用初始化列表时,可添加=,也可不添加。

//定义一个变量并初始化
int units_sold=0;
int units_sold(0);
int units_sold={0};  //列表初始化
int units_sold{0};    //列表初始化

当初始化列表用于内置类型的变量时,这种初始化形式有一个重要特点:如果我们使用列表初始化值存在丢失信息的风险,则编译器将报错:

long double ld=3.1415926536;
int a={ld},b={ld}; //错误:转换未执行,因为存在丢失信息的风险
int c(ld),d=ld;   //正确:转换执行,且确实丢失了部分值

列表初始化就谈到这里,接下来介绍initializer_list的使用
它提供的操作如下:

initializer_list<T> lst; 
//默认初始化;T类型元素的空列表
initializer_list<T> lst{a,b,c...};
//lst的元素数量和初始值一样多;lst的元素是对应初始值的副本
lst2(lst)   
lst2=lst  
//拷贝或赋值一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本元素共享
lst.size()  //列表中的元素数量
lst.begin()  //返回指向lst中首元素的指针
lst.end()   //返回指向lst中尾元素下一位置的指针

需要注意的是,initializer_list对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值。并且,拷贝或赋值一个initializer_list对象不会拷贝列表中的元素,其实只是引用而已,原始列表和副本共享元素。

和使用vector一样,我们也可以使用迭代器访问initializer_list里的元素

void error_msg(initializer_list<string> il)
{
   for(auto beg=il.begin();beg!=il.end();++beg)
      cout<<*beg<<" ";
   cout<<endl;
}

如果想向initializer_list形参中传递一个值的序列,则必须把序列放在一对花括号内:

//expected和actual是string对象
if(expected != actual)
   error_msg({"functionX",expectde,actual});
else
   error_msg({"functionX","okay"});

说了这么多,那initializer_list到底有什么应用呢?

有了initializer_list之后,对于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 };

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

#include <iostream>
#include <vector>

class MyNumber
{
public:
    MyNumber(const std::initializer_list<int> &v) {
        for (auto itm : v) {
            mVec.push_back(itm);
        }
    }

    void print() {
    for (auto itm : mVec) {
        std::cout << itm << " ";
    }
  }
private:
    std::vector<int> mVec;
};

int main()
{
    MyNumber m = { 1, 2, 3, 4 };
    m.print();  // 1 2 3 4

    return 0;
}
C++ 中的 initializer_list 详解 本文介绍了C++11中的initializer_list特性,它简化了对象初始化过程。文章首先解释了initializer_list的基本概念和语法,对比了C++11前后初始化方式的差异。然后深入剖析了其内部结构和工作原理,包括编译器如何处理花括号初始化以及相关生命周期问题。接着展示了标准库中容器、算法对initializer_list的应用,以及如何为自定义类添加initializer_list构造函数。通过示例代码详细说明了这一特性的各种用法,帮助读者全面掌握这一现代化C++初始化方式。 (摘要共147 阅读详情

相关推荐

C++ initializer_list 类型详解

initializer_list是C++11提供的新类型,定义在头文件中。 用于表示某种特定类型的值的数组,和vector一样,initializer_list也是一种模板类型。 template< class T > class initializer_list; 1 2 要介绍initializer_list的使用,有必要先谈一谈列表初始化。 C++11扩大...

digitalkee的博客 1046

C++中的std::initializer_list详解

initializer_list是C++11提供的一种新类型,其定义于头文件<initializer_list>中,此头文件是工具库的一部分,<initializer_list>定义如下: namespace std { template<class E> class initializer_list { public: using value_...

FEEL的博客 1万+

ADS使用Smith圆图进行阻抗匹配

在处理RF系统的实际应用问题时,总会遇到一些非常困难的工作,对各部分级联电路的不同阻抗进行匹配就是其中之一。一般情况下,需要进行匹配的电路包括天线与低噪声放大器(LNA)之间的匹配、功率放大器输出(RFOUT)与天线之间的匹配、LNA/VCO输出与混频器输入之间的匹配。匹配的目的是为了保证信号或能量有效地从“信号源”传送到“负载”。 阻抗匹配(impedance matching) 信号源内阻与所接传输线的特性阻抗大小相等且相位相同,或传输线的特性阻抗与所接负载阻抗的大小相等且相位相同,分别称为传输线的输

红茶绿茶和奶茶的博客 3万+

C++之std::initializer_list详解

类的构造函数可以接受 std::initializer_list 参数,以便在创建对象时使用初始化列表进行初始化。public:private:从上面可以看到,使用std::initializer_list的优点:1)灵活性和扩展性:std::initializer_list可以用在任何需要可变数量参数的函数中,提供了高度的灵活性和扩展性。例如,你可以写一个接受std::initializer_list 参数的函数,让它可以接受任意数量的元素进行初始化。2)

红军不怕远征难,万水千山只等闲 3853

军品研制过程评审活动-(一)论证阶段

军品研制过程评审活动-(一)论证阶段

Abel的博客 3814

【即插即用模块】卷积篇 | TGRS 2025 | HLKConv:小核+空洞=大核,感受野一致,但更轻更准!

本文介绍了分层大核卷积模块HLKConv,该模块通过动态大核+空洞卷积实现高效感受野扩展,将超大核卷积分解为小核+空洞卷积(如53×53核用17×17+dilation=3实现),计算量仅为普通大核的1/10。模块采用双分支设计:基础卷积分支捕捉局部细节,大核空洞分支捕捉长距离关联,通过1×1卷积融合。实验表明HLKConv在红外小目标检测中优于传统大核卷积,适用于高分辨率视觉任务。代码实现了不同核尺寸的配置,输入输出特征维度保持不变,计算效率显著提升。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 346

现代C++之std::initializer_list的特性分析

一、从变量初始化开始谈起 一般而言,对变量或对象使用括号初始化的方式被称为直接初始化,其本质是调用了相应的构造函数;而使用等号初始化的方式则被称为拷贝初始化,说到拷贝大家可能马上就会想到拷贝构造函数、operator =()函数,但此时并不一定是调用了这两个函数,这点极容易混淆!!! 为了阐明上述的观点,我们不妨通过一个小实验的方式来验证上述的说法: #include<iostream> class Test { public: Test(int...

留恋单行路_Blog 3545

在Tricore上移植μC/OS-III——1.1 AURIX Development Studio的使用

本文主要介绍AURIX Development Studio软件的安装和使用方法。 英飞凌针对Tricore系列单片机推出了一款免费的软件——AURIX™ Development Studio,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 可从下面的链接获取软件安装包,软件安装好后,新建工程时会自

weixin_42967006的博客 2290

C++initializer_list详解

initializer_list 是 C++11引入的一个强大特性,它为统一初始化提供了支持,简化了构造函数重载,并使得初始化列表的使用变得更加灵活。但是,在使用 initializer_list 时,需要注意其只读性质和潜在的生命周期问题。理解其工作原理及限制后,你可以有效地在自己的 C++代码中使用 initializer_list,使代码更加清晰和高效。

程序猿老樊的博客 3822

1-Wire 单总线硬件结构及软件时序分析(实测波形+C代码分析)

1根线就可以通信,是不是很神奇?因为其节省I/O口的优点而被广泛使用!

记得诚 1万+

【Claude】Invalid model / Opus not available 错误:模型不可用的原因 bug报错已解决

使用 Claude API 时,指定错误或不可用的模型 ID 会收到 Invalid model 错误。本文从模型命名规则出发,给出模型降级链与动态选择方案。

博客 7913

C++11中新特性之:initializer_list详解

C++11提供的新类型,定义在<initializer_list>头文件中。 template< class T > class initializer_list; 先说它的用处吧,然后再详细介绍一下。 首先有了initializer_list之后,对于STL的容器的初始化就方便多了,比如以前初始化一个vector需要这样: int a[] = {0, 1, 2, 3}; std::vector<int> vec(a, a+sizeof(a)); 或者 std::

weixin_51725434的博客 9061

SAP FICO 金税系统-金税->SAP接口功能开发说明书(接口字段)

SAP FICO 金税系统-金税->SAP接口功能开发说明书(接口字段)

我好像病了的博客 1257

【C++11】initializer_list详解!

nitializer_list 是一种C++11新的类型特性,它允许我们以统一的方式初始化对象。它是一个代表数组的轻量级包装器,通常用于构造函数和函数参数中,以允许传递一个初始化元素列表。initializer_list也是一种模板类型。;begin()end()迭代器以及获取区间中元素个数的方法size()保存的只是指向一个常量,无法对其修改C++11允许构造函数和其他函数把初始化列表当做参数。

luhaoran814的博客 932

饥饿游戏搜索算法(HGS)详解:从生物激励到智能优化

饥饿游戏搜索算法(HGS)是一种受动物饥饿驱动觅食行为启发的智能优化算法。该算法通过模拟生物饥饿程度与觅食策略的关系,将个体适应度映射为饥饿感,并据此动态调整搜索行为。HGS的核心机制包括:1) 饥饿权重计算(W1/W2),2) 三种位置更新策略(随机探索、正向/负向协作),3) 自适应平衡参数E。算法通过迭代优化逐步改进解的质量,具有参数自适应、全局搜索能力强等特点,在复杂优化问题中表现出色。相比传统优化方法,HGS更注重个体内部状态对搜索行为的影响,实现了探索与开发的自然平衡。

qq_42212808的博客 154

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++ std::initializer_list 详解

cpppublic:// 使用// 输出: Constructed with 3 elements。

An15294874732的博客 1247

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++11详解(一):统一初始化——列表初始化与 initializer_list

在 C++98 中,不同类型往往使用不同方式初始化。int x;int y;int x = 10;数组 → {}普通变量 → =对象 → ()容器 → 一个一个插入初始化语法并不统一。{}列表初始化class Datepublic:{}private:int _year;int _month;int _day;202511寻找能够匹配的构造函数。可以把它理解成:一个轻量级对象,用来访问编译器为创建的一组只读元素。il↓。

Face_FeaR的博客 424

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++11统一列表初始化与std::initializer_list详解

在C++编程中,初始化操作是基础但关键的技术点。从C++98到C++11,初始化方式经历了重大革新,引入了统一列表初始化语法和std::initializer_list机制。统一列表初始化通过大括号{}语法解决了传统初始化方式不一致的问题,同时具备防止窄化转换、避免语法歧义等优势。std::initializer_list作为轻量级模板类,为容器和自定义类提供了简洁的初始化方案,广泛应用于现代C++开发。这些特性在STL容器初始化、构造函数设计等场景中发挥着重要作用,是提升代码质量和开发效率的关键技术。理解

weixin_30731305的博客 534

c++ std::initializer_list一篇详解!

std::initializer_list是C++11引入的轻量级代理类型,用于表示花括号初始化列表内容。它作为临时数组的只读视图,包含指向const元素数组的指针和元素数量,支持迭代器访问但不拥有数据。主要应用于容器构造(如vector、map)、函数参数传递和赋值操作,使初始化更直观。使用时需注意:元素类型必须一致、不能修改元素、警惕生命周期问题(底层临时数组与initializer_list对象同生命周期)。典型用法包括实现支持列表初始化的构造函数和接收任意数量同类型参数的函数,是C++统一初始化语法

maybe_Tian_Xia的博客 302

C++ STL 之 initializer_list、结构化绑定与 if constexpr 详解

本文介绍了现代C++(C++11~C++20)中的三个关键特性:std::initializer_list、结构化绑定和if constexpr。initializer_list是只读数组的语法糖,统一了初始化方式但需注意隐式转换陷阱;结构化绑定(C++17)简化了解包tuple、数组和结构体的操作,提供三种绑定模式;if constexpr实现了编译期分支,消除了SFINAE的复杂性,使模板代码更简洁。这些特性在日常STL使用中频繁出现,理解其原理有助于避免潜在问题。

Rick_Theseusr的博客 378

C++11 std::initializer_list:原理与应用详解

在C++编程中,容器初始化是常见的操作场景。传统C++需要通过循环或迭代器进行繁琐的初始化,而现代C++11引入的std::initializer_list机制彻底改变了这一局面。该特性本质上是一个轻量级的常量元素代理容器,通过编译器自动将大括号初始化语法转换为initializer_list对象,实现了类似Python列表初始化的简洁语法。从技术实现看,它通过常量指针和长度封装,支持constexpr编译期计算,与STL容器深度集成。在工程实践中,initializer_list不仅大幅提升了数学库、测试

weixin_31423955的博客 220

C++11 新特性详解(一):列表初始化、initializer_list 与右值引用

C++11 是 C++ 发展历史上非常重要的一次标准更新。它并不是简单地增加几个语法,而是对C++ 的对象管理、泛型编程、STL、函数对象等多个方面进行了系统性的增强。C++11 在 2011 年正式被 ISO 采纳,在 C++98 到 C++11 之间经历了较长的标准空窗期,因此它也是现代 C++ 的一个重要分界点。本文按照 C++11 的知识脉络,从最容易理解的列表初始化开始,逐步进入 C++11 最重要的核心内容之一——右值引用和移动语义。学习这一部分时不要急着背语法,尤其是右值引用、

2501_93577780的博客 382

【C++11】initializer_list、可变参数模板详解

在C++98及这前的版本中类模版和函数模版中只能含固定数量的模版参数C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板模板参数包是一个特殊的模板参数,它表示零个或多个模板参数。在函数模板或类模板的定义中,可以使用省略号(…)来声明一个模板参数包。// Args是一个模板参数包,args是一个函数形参参数包// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。// 这里可以使用递归或循环来展开参数包。

liuty0125的博客 1410
上一篇: c++运算符重载
下一篇: mysql数据库的基本使用
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值