【C++】C++11:列表初始化、声明、STL升级

发布时间:2026/7/19 3:23:46
【C++】C++11:列表初始化、声明、STL升级 C11列表初始化、声明、STL升级1、列表初始化1.1 C98传统的{}在C98中标准允许使用花括号{}对数组或结构体元素进行统一的列表初始化structPoint{int_x;int_y;};intmain(){intarray1[]{1,2,3,4,5};intarray2[5]{0};Point p{1,2};return0;}1.2 C11中的{}C扩大了用大括号括起的列表初始化列表的使用范围试图实现⼀切对象皆可用{}初始化{}初始化的过程中可以省略掉但建议不去掉intmain(){intarray1[]{1,2,3,4,5};intarray2[5]{0};Point p{1,2};// C11中列表初始化应用在内置类型上intx11;intx2{1};intx3{1};return0;}创建对象时也可以使用列表初始化的方式来调用构造函数初始化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(){Dated1(2025,9,18);Date d2{2025,9,18};Date d3{2025,9,18};// 可以省略赋值符号constDated4{2024,7,25};// 需要注意的是C98支持单参数时类型转换也可以不用{}Date d5{2025};Date d62025;return0;}2、C11中的std::initializer_list模拟实现vector中的{}初始化演示效果templateclassTclassvector{public:typedefT*iterator;vector(initializer_listTl){for(autoe:l)push_back(e)}// 赋值vectoroperator(initializer_listTil){vectorTtmp(il);swap(tmp);return*this;}mapoperator(initializer_listvalue_typeil);private:iterator _startnullptr;iterator _finishnullptr;iterator _endofstoragenullptr;};std::initializer_list应用演示intmain(){vectorintv1{1,2,3,4,5,6,7,8,8};// 任意多个int值的{}列表v1{1,2,3};autoil{1,2,3,4,5,6,7,8,8};coutsizeof(il)endl;couttypeid(il).name()endl;// 这里是pair对象的{}初始化和map的initializer_list构造结合到一起用了mapstring,stringdict{{sort,排序},{string,字符串}};}3、声明C11提供了多种简化声明的方式尤其是在使用模板时3.1 auto在C98中auto是存储类型的说明符表明变量是局部自动存储类型但是局部域中定义局部变量默认就是自动存储类型所以auto就没什么价值了。C11中废弃auto原来的用法讲其用于实现自动类型判断。这样要求必须进行显示初始化让编译器将定义对象的类型设置为初始化值的类型intmain(){inti10;autopi;autopfstrcpy;couttypeid(p).name()endl;couttypeid(pf).name()endl;mapstring,stringdict{{sort,排序},{insert,插入}};//mapstring, string::iterator it dict.begin();autoitdict.begin();return0;}输出结果int *char * (__cdecl*)(char *,char const *)3.2 不能使用auto的场景auto不能作函数形参voidfunc(autox){}auto不能作为函数的返回值// C11 报错不能直接 auto 作返回值autotest(){return10;}数组类型推导不能直接 auto 数组intarr[5]{1,2,3};autoaarr;// a 是 int*不是数组丢失数组长度信息// 无法用 auto 保留原生数组类型必须用 autoautoa2arr;// 才是 int()[5]new 分配时不能用 auto 单独写autopnewauto(10);4、STL中的变化下图1圈起来的就是STL中的新容器但是实际最有用的是unordered_map和unordered_set。这两个我们前面已经进行了非常详细的讲解其他的大家了解⼀下即可。STL中容器的新接口也不少最重要的就是右值引⽤和移动语义相关的push/insert/emplace系列接口和移动构造和移动赋值还有initializer_list版本的构造等这些前面都讲过了还有一些无关痛痒的如cbegin/cend等需要时查查文档即可。