嘿各位技术潮人好久不见甚是想念。生活就像一场奇妙冒险而编程就是那把超酷的万能钥匙。此刻阳光洒在键盘上灵感在指尖跳跃让我们抛开一切束缚给平淡日子加点料注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗Let’s go我的博客yuanManGan我的专栏C入门小馆 C言雅韵集 数据结构漫游记 闲言碎语小记坊 进阶数据结构 走进Linux的世界 题山采玉 领略算法真谛C 111.C11的发展历史C11是C发行的第二个主要版本并且对比C98,有了重要的更新C03之后过了整整八年才C11才真正问世。从此C版本每隔3年推出一次版本。2. 列表初始化2.1 C98传统的{}在c98中{}主要用于初始化数组和简单的结构体。structPoint{int_x;int_y;};intmain(){// 数组初始化inta1[]{1,2,3,4,5};inta2[5]{0};// 结构体初始化Point p{1,2};return0;}基本类型不能用{}初始化需要使用赋值或者构造函数。intx19;// 赋值初始化classDate{public:Date(intyear1,intmonth1,intday1):_year(year),_month(month),_day(day){}private:int_year;int_month;int_day;};intmain(){Dated(2025,1,1);// 使用构造函数初始化return0;}2.2 C11中的{}c11引入了列表初始化使得几乎所有类型的对象都可以使用{}初始化{}初始化也叫列表初始化。内置类型支持自定义类型也支持自定义类型的列表初始化等于先创建临时对象然后进行拷贝构造编译器优化为直接构造。{}初始化中可以省略。#includeiostream#includevectorusingnamespacestd;structPoint{int_x;int_y;};classDate{public:Date(intyear1,intmonth1,intday1):_year(year),_month(month),_day(day){coutDate(int year, int month, int day)endl;}Date(constDated):_year(d._year),_month(d._month),_day(d._day){coutDate(const Date d)endl;}private:int_year;int_month;int_day;};intmain(){//C11支持的//1.内置类型inta{5};//2.自定义类型Date d1{2025,9,3};//这里的本质是先创造临时对象然后d1拷贝构造构造临时对象//但编译器进行优化后就直接会用(2025, 9, 3)进行构造constDated2{2025,9,3};//这里d2引用的是{2025, 9, 3}创建的临时对象// 需要注意的是C98⽀持单参数时类型转换也可以不⽤{}Date d3{2025};Date d42025;// 可以省略掉Point p1{1,2};intx2{2};Date d6{2024,7,25};constDated7{2024,7,25};//只有{}初始化才能省略// Date d8 2025;vectorDatev;v.push_back(d1);v.push_back(Date(2025,1,1));// ⽐起有名对象和匿名对象传参这⾥{}更有性价⽐v.push_back({2025,1,1});return0;}2.3 C11中的std::initializer_list虽然上面的初始化已经很方便了但在容器初始化时如果我们用多个值进行初始化时就要写很多构造函数很麻烦。vectorintv1{1,2,3};vectorintv2{1,2,3,4,5};C11库中提出了⼀个std::initializer_list的类这个类底层是开一个数组将数据拷贝过来然后有两个指针分别指向开头和结尾。这是他的⽂档initializer_liststd::initializer_list⽀持迭代器遍历。容器⽀持⼀个std::initializer_list的构造函数也就⽀持任意多个值构成的 {x1,x2,x3…} 进⾏初始化。STL中的容器⽀持任意多个值构成的 {x1,x2,x3…} 进⾏初始化就是通过std::initializer_list的构造函数⽀持的。#includeiostream#includevector#includestring#includemapusingnamespacestd;intmain(){std::initializer_listintmylist;mylist{10,20,30};coutsizeof(mylist)endl;// 这⾥begin和end返回的值initializer_list对象中存的两个指针// 这两个指针的值跟i的地址跟接近说明数组存在栈上inti0;coutmylist.begin()endl;coutmylist.end()endl;coutiendl;// {}列表中可以有任意多个值//// 这两个写法语义上还是有差别的第⼀个v1是直接构造// 第⼆个v2是构造临时对象临时对象拷⻉v2优化为直接构造// v3: 引用绑定。{...}构造出一个临时vector纯右值v3直接绑定到该临时对象。vectorintv1({1,2,3,4,5});vectorintv2{1,2,3,4,5};constvectorintv3{1,2,3,4,5};// 这⾥是pair对象的{}初始化和map的initializer_list构造结合到⼀起⽤了mapstring,stringdict{{sort,排序},{string,字符串}};// initializer_list版本的赋值⽀持v1{10,20,30,40,50};return0;}