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

《C++ Primer 第五版》 initializer_list

1️⃣ initializer_list 是什么?

在 C++11 里引入了 统一初始化语法

int x{10};
vector<int> v{1,2,3,4};

这种用 {} 花括号的写法,底层就是靠 std::initializer_list 来支持的。

一句话理解
initializer_list<T> 就是一个 只读的轻量容器,里面保存了 {} 花括号里的那批常量元素。


2️⃣ 它的内部结构

std::initializer_list<T> 其实就是:

  • 一个指向常量数组的指针

  • 一个大小 size

所以它很轻量,拷贝、赋值都只是复制指针和大小,并不会真正复制所有元素。

⚠️ 元素是 只读 的,不能修改。


3️⃣ 典型用法

📌(1)作为容器初始化工具

#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> v = {1, 2, 3, 4, 5}; // 内部调用 initializer_list 构造函数for (int x : v) cout << x << " ";return 0;
}


📌(2)作为函数参数

#include <initializer_list>
#include <iostream>
using namespace std;int sum(initializer_list<int> lst) {int total = 0;for (auto x : lst) total += x;return total;
}int main() {cout << sum({1, 2, 3, 4}) << endl;  // 输出 10
}

这种写法非常优雅,不用传数组,也不用写循环。


📌(3)手工使用 initializer_list

#include <iostream>
#include <initializer_list>
using namespace std;int main() {initializer_list<int> lst{10, 20, 30};cout << "size = " << lst.size() << endl;cout << "first = " << *lst.begin() << endl;for (auto val : lst) cout << val << " ";
}

输出:

size = 3 first = 10 10 20 30


4️⃣ 常见注意点

  1. 元素只读

    for (auto &x : lst) x = 100; // ❌ 错误,不能修改
    

  2. 生命周期

    • initializer_list 内部指向的是编译器生成的临时数组。

    • 所以不能返回一个局部 initializer_list 引用。

  3. 效率

    • 拷贝和赋值非常快,因为它只是浅拷贝。


5️⃣ 总结口诀

  • initializer_list<T> = {} 花括号背后的秘密。

  • 常用在 容器初始化函数参数传递

  • 本质:指针 + 大小,只读轻量容器

  • 优点:让 C++ 初始化和调用看起来更简洁,像脚本语言。


 一句比喻:
initializer_list 就像 一次性快餐盒

  • 花括号 {} 放进什么,它就原封不动地打包。

  • 你可以拿来吃(遍历),但不能往里面加菜(只读)。

  • 盒子本身很轻,拷来拷去都没问题。

http://www.dtcms.com/a/349704.html

相关文章:

  • 记一次 element-plus el-table-v2 表格滚动卡顿问题优化
  • Vue SFC Playground 如何正确引入 naive-ui
  • Kubernetes高可用架构设计:多Master节点部署与etcd集群运维深度指南
  • 6.3Element UI 的表单
  • Odoo 非标项目型生产行业解决方案:专业、完整、开源
  • 第十七节:高级材质 - ShaderMaterial揭秘
  • SOME/IP-SD报文中 Entry Format(条目格式)-理解笔记4
  • 从“数据孤岛”到“业财融合”,外贸订单管理ERP重构一体化逻辑
  • 将跨平台框架或游戏引擎开发的 macOS 应用上架 Mac App Store
  • springboot中操作redis的步骤
  • 6.4 Element UI 中的 <el-table> 表格组件
  • 疯狂星期四文案网第49天运营日记
  • 疯狂星期四文案网第50天运营日记
  • 渗透测试报告编写平台 | 简化和自动化渗透测试报告的生成过程。
  • JVM 与容器化部署优化:突破资源隔离的性能瓶颈
  • Ant Design for UI 选择下拉框
  • 详细介绍Vue-Router及其实现原理、路由模式
  • 探索汽车材料新纪元:AUTO TECH 2025广州先进汽车材料展即将震撼来袭
  • Linux系统编程——进程 | 线程
  • SSM基础知识-SpringMVC-视图解析(ModelAndView)、方法请求参数接收、方法返回值处理、RESTful 风格、拦截器、全局异常
  • UniApp文件上传大小限制问题解决方案
  • Mysql 5.7 与 SqlSugar 5.X 整合开发实战
  • 对线性代数伴随矩阵的深刻理解
  • ComfyUI AI一键换装工作流无私分享
  • 【ansible】6.主机模式以及包含和导入文件
  • Ansible自动化运维介绍与安装
  • 国内代理 IP 的类型:住宅 IP、机房 IP、移动 4G/5G IP 区别
  • 愿景娱乐:践行“流量向善”以公益行动赋能“她”未来
  • RAG(知识库ChatPDF)
  • 开源大模型天花板?DeepSeek-V3 6710亿参数MoE架构深度拆解