std::initialzer_list 与花括号{}数据列表
author: hjjdebug
date: 2025年 05月 22日 星期四 15:50:23 CST
descrip: std::initialzer_list 与花括号{}数据列表
文章目录
- 1.{数值列表}是什么?
- 1.1 数组初始化 时 , 称为数组初始化列表
- 1.2. 当用于容器时, 称为容器初始化列表
- 1.3. 对于结构体或类,{1,2,3,4,5} 可用于初始化成员变量
- 2. std::initializer_list 是什么?
- 3. 实现自己的initializer_list
- 3.1 可变参数包
- 3.2 实现自己的initializer
- 4.std::intializer_list 使用举例
- 5. 小结
我对如下语句发生了疑惑
std::initializer_list<int> data={1,2,3,4,5};
这到底是什么意思? 为什么它能用这样的语法?
1.{数值列表}是什么?
{1,2,3,4,5} 在c++中叫什么? 为什么用{}
1.1 数组初始化 时 , 称为数组初始化列表
例:
int arr[] = {1,2,3,4,5};
1.2. 当用于容器时, 称为容器初始化列表
std::vector<int> vec = {1,2,3,4,5}; // 初始化 vector
std::set<int> s = {1,2,3,4,5}; // 初始化 set
我也曾经常使用vector, 我把这种写法当成一种很自然的写法,
认为它天生就等价于把数值直接付给vector对象中的元素. 其实应该是想得太简单了.
1.3. 对于结构体或类,{1,2,3,4,5} 可用于初始化成员变量
struct Point { int x; int y; int z; };
Point p = {1, 2, 3}; // c语言方式结构体成员初始化, 顺序填充成员.
所以{1,2,3,4,5}没有统一标准, 与上下文有关, 还是叫花括号列表吧, 编译器没有对它规范约束.
2. std::initializer_list 是什么?
std::initializer_list是C++11标准库中的一个类模板
std::initializer_list本质上是一个轻量级的容器,用于存储相同类型的一组值,
并且这些值在其生命周期内是只读的。它通过存储一个指向常量数组的指针和元素个数来实现,
允许用户遍历其中的元素, 由于内部数据是const的,因此它仅能读取数据,不能修改其中的值
看了定义我还是不懂,它为什么能支持初始化列表?
std::initializer_list<int> data={1,2,3,4,5}; 为什么能够把数据列表放到对象中.
要想搞清楚它的工作原理, 莫若自己实现一个 initializer_list!
3. 实现自己的initializer_list
先认识一下可变参数包
3.1 可变参数包
可变参数包, 从函数调用的角度看, 就是有不定个数的参数,0个或者多个.
c++给我们想好了, 这可以用funcname(type… args) 来表达. type…就是任意个参数
由于类型也可变, 没关系, c++有类模板,支持各种类型, 类型可变,那也加个…表示可变.
即型如 template<typename… T_ARGS>
把2者连起来, 如下形式, 表示可变类型,可变参数的统一形式
template<typename… T_Args> void func(T_Args… args)
这就是可变参数模板. c++11 开始支持
其中, typename… 声明模板支持0个或多个类型参数
其中,T_Args… 表示函数可接受任意数量的参数,这些参数的类型由typename 指定
sizeof…(T_Args)可获取参数数量
args, 可变参数包名称,可以被展开.
举例:
#include <iostream>template<typename... Args>
void printAll(Args... args) {
// (std::cout << ... << args ) << std::endl; //左折叠表达式也可以((std::cout << args ), ...) << std::endl; //逗号加右折叠表达式也可以
}//,表达式用于连接多个操作
//右折叠表达式 ... 在参数包的右边, 右折叠从右向左结合,不过本例没有结合性
template<typename T, typename... Args>
void printWithComma(T first, Args... args) {std::cout << first;((std::cout << ", " << args), ...); //逗号加右折叠表达式std::cout << std::endl;
}
int main() {printWithComma(1, 2.5, "hello"); // 输出:1,2.5,helloprintAll("A", "B", "C"); // 输出:ABCreturn 0;
}
执行:
$ ./temp
1,2.5,hello
ABC
说明:
(std::cout << … << args) 是C++17引入的折叠表达式(Fold Expression)语法
… ,参数包展开符, 必需在折叠表达式中使用才有效
args,可变参数包, 在折叠式中代表一个参数.
3.2 实现自己的initializer
实现代码:
#include <stdio.h>
#include <vector>template<typename T>
class MyInitializer
{std::vector<T> data_;public:template<typename... T_Args>MyInitializer(T_Args&&... args) {data_.reserve(sizeof...(T_Args)); //调整vector 容量//emplace安置 emplace_back尾部安置比push_back效率更高,免copy(data_.emplace_back(std::forward<T_Args>(args)), ...); //折叠表达式,...表示展开参数包}size_t size() const { return data_.size(); }auto begin() const { return data_.begin(); }auto end() const { return data_.end(); }
};int main()
{MyInitializer<int> initList{1, 2, 3};for(auto it=initList.begin(); it!=initList.end();it++){printf("%d\n",*it);}return 0;
}
执行结果:
$ ./temp2
1
2
3
为什么可以接受 {1,2,3} 初始化列表?
因为c++11 始引入了可变参数包语法支持 template<typename… T_Args>,
可支持任意类型,可变参数0个或多个的语法. 能够逐个取到每个参数.
类对象初始化中的{1,2,3} 认为是3个整形数
函数调用中的(1,2.5,“hello”)认为是1个整数,1个浮点数,1个字符串的列表数据.
看起来{},()所起的作用还是有点混乱, 不如逗号,是数据的分割意义很明确.
初始化器为什么要求初始化列表是**“一种"数据类型? 而不能是"多种”**数据类型.
因为它的实现使用了数据容器,类似于vector, 数据容器要求数据是一种类型.
std::initializer_list<int> data={1,2,3,4,5}; 语句解释.
{1,2,3,4,5}是一个花括号列表数据,它会被隐士转换为一个initializer_list 的无名对象,
对象的构建方式当然是它的构造函数, 其构造函数支持列表数据初始化.
然后通过赋值构造函数把无名对象赋值给对象 data
有了这些基础,就可以使用std::initializer_list 标准库模板函数了.
下面给个测试例,体会一下c语言的做法传递数组,与c++的做法传递初始化列表对象(initializer_list obj)的差别.
4.std::intializer_list 使用举例
#include <initializer_list>
#include <vector>
#include <iostream>//定义一个int容器, 用初始化列表接受初始化数据
class IntContainer
{
public://构造函数中使用initializer_list对象做参数//vector 支持 list对象初始化IntContainer(std::initializer_list<int> list_obj) : m_data(list_obj){}void print() const {for (auto elem : m_data) {std::cout << elem << ' ';}std::cout << std::endl;}
private:std::vector<int> m_data;
};//函数中使用
int sum_obj(std::initializer_list<int> list_obj) //对象自带大小.
{int total = 0;for (auto& num : list_obj) // 传递对象很安全,对象甚至不用大小,直接枚举.{total += num;}return total;
}void printArr(int *arr, int size) //传递数组不安全,size出错就出错.
{for(int i=0;i<size;i++){printf("%d ",arr[i]);}printf("\n");
}int sum_c(int *arr, int size)
{int total = 0;for (int i=0;i<size;i++) //size 很危险,万一传错参数,arr[i]要出错!{total += arr[i];}return total;
}
int main() {std::initializer_list list_obj={1,2,3,4,5}; //会发生隐含转换,从数值列表到无名list对象,然后再调用list的赋值构造IntContainer container_obj = list_obj; //先创建无名container对象,再调用默认的赋值构造函数(浅copy构造函数)
// IntContainer container_obj = {1, 2, 3, 4, 5}; //一步也可以,过程是数值列表->无名list对象->无名container对象->container_obj对象.container_obj.print(); // 输出:1 2 3 4 5int n = sum_obj({1,2,3,4,5}); //隐含转换,从数值列表到无名list对象,传递给函数参数,传递的是对象,安全!printf("sum_obj:%d\n",n);int arr[] = { 1,2,3,4,5}; // c语言的做法, 用数组. 但元素的个数就是一个风险因素,传错就有麻烦!
#define SIZE sizeof(arr)/sizeof(int)printArr(arr,SIZE); //c函数传递SIZE 不安全,万一传错就有风险!n=sum_c(arr, SIZE); //c函数传递SIZE 不安全,万一传错就有风险!printf("sum_c:%d\n",n);return 0;
}
执行结果:
$ ./tt
1 2 3 4 5
sum_obj:15
1 2 3 4 5
sum_c:15
5. 小结
总之:
用对象传递安全,因为对象自带大小. 用数组传递不安全.用数组还要传递大小,有出错风险.
相关文章:
std::initialzer_list 与花括号{}数据列表
author: hjjdebug date: 2025年 05月 22日 星期四 15:50:23 CST descrip: std::initialzer_list 与花括号{}数据列表 文章目录 1.{数值列表}是什么?1.1 数组初始化 时 , 称为数组初始化列表1.2. 当用于容器时, 称为容器初始化列表1.3. 对于结构体或类,{…...
C++初阶-list的使用2
目录 1.std::list::splice的使用 2.std::list::remove和std::list::remove_if的使用 2.1remove_if函数的简单介绍 基本用法 函数原型 使用函数对象作为谓词 使用普通函数作为谓词 注意事项 复杂对象示例 2.2remove与remove_if的简单使用 3.std::list::unique的使用 …...
从单链表 list 中删除第 i 个元素--Python
从单链表 list 中删除第 i 个元素 一、问题引入二、解题步骤1.思维导图2.解题步骤 三、代码实现四、个人总结 一、问题引入 请编写程序,将 n 个整数顺次插入一个初始为空的单链表的表头。随后对任意给定的位序 i,删除链表中第 i 个结点。注意࿱…...
GraphPad Prism工作表的基本操作
《2025新书现货 GraphPad Prism图表可视化与统计数据分析(视频教学版)雍杨 康巧昆 清华大学出版社教材书籍 9787302686460 GraphPadPrism图表可视化 无规格》【摘要 书评 试读】- 京东图书 GraphPad Prism中包含5种工作表,每种工作表的基本操…...
C++初阶-list的使用1
目录 1.std::list简介 2.成员函数 2.1构造函数的使用 2.2list::operator的使用 3.迭代器 4.容量 4.1list::empty函数的使用 4.2list::size函数的使用 4.3list::max_size函数的使用 5.元素访问 6.修饰符 6.1list::assign函数的使用 6.2push_back和pop_back和push_fr…...
文献解读-病理影像多模态模型预测乳腺癌新辅助化疗的病理完全反应
期刊:Science Advances 影响因子:11.7,中科院1区Top 发表时间:2025年4月30日 概要:首都医科大学宣武医院放射科卢洁教授团队近日(2025年5月)在中科院1区top期刊《Sci Adv》(IF11.7&a…...
Docker-Mysql
查看容器的详细信息 docker inspect mysql-8.4.5 Docker 启动 local-mysql 的完整命令 docker run -d \--name local-mysql \-e MYSQL_ROOT_PASSWORDyour_root_password \-v /AllenDocker/mysql/data:/var/lib/mysql \-p 3306:3306 \--restart unless-stopped \mysql:8.4.5 验…...
鸿蒙进阶——CMakelist、GN语法简介及三方库通用移植指南
文章大纲 引言一、GN常用的内置变量二、GN常用的内置函数三、CMake 重要语法1、生成动态库2、生成静态库3、生成OBJECT 库4、重要的函数和模块4.1、add_definitions4.2、execute_process4.3、add_dependencies4.4、install4.5、FetchContent 四、GN 重要语法1、编译Target2、预…...
场景化应用实战系列六:检索问答系统
目录 景化应用实战系列六:检索问答系统 一、目标设定 二、关键知识点梳理 三、案例讲解与实战操作 1. 数据准备与预处理 2. 倒排表构建 3. 文本相似度计算 4. 检索问答系统实现 5. 系统优化与改进 一、目标设定 构建一个高效的检索问答系统,能…...
3452. 好数字之和
题目来源: LeetCode题目:3452. 好数字之和 - 力扣(LeetCode) 解题思路: 按要求判断求和即可。 解题代码: #python3 class Solution:def sumOfGoodNumbers(self, nums: List[int], k: int) -> int:r…...
GEE数据下载问题记录
GEE下载数据时的一些记录 1. GPT说 2. 验证 在未指定投影坐标系的情况下,下载原始数据导出的是MODIS Sinusoidal投影,如果单纯的对波段值进行操作,不会进行投影转换,如果涉及到波段平均,则会转投影到WGS84坐标系。如…...
P1833 樱花
P1833 樱花 - 洛谷 题目背景 《爱与愁的故事第四弹plant》第一章。 题目的描述 爱与愁大神后院里种了n棵樱花树,每棵都有美学值Ci(0≤Ci≤200)。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸,他懂得如何欣赏樱花:一种樱…...
文件操作和IO-3 文件内容的读写
文件内容的读写——数据流 流是操作系统提供的概念,Java对操作系统的流进行了封装。 数据流就像水流,生生不息,绵延不断。 水流的特点:比如要100mL的水,可以一次接10mL,分10次接完,也可以一次接…...
Day 0015:Metasploit 基础解析
目录 一、理论学习(Metasploit 架构与核心组件) 一、架构设计:分层与模块化 基础层(Ruby 框架): 核心层(模块引擎): 接口层(交互界面)&#…...
相机标定与图像处理涉及的核心坐标系
坐标系相互关系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…...
单例模式的运用
单例模式实现分析 在我们的向量数据库配置类 MilvusVectorDatabaseConfig 中,采用了单例模式的实现方式,这是一种非常经典且实用的设计模式。 饿汉式单例实现 这种实现方式属于饿汉式单例模式,它的优点在于: // 在类加载时就创…...
PageHelper分页原理解析:从源码到MySQL方言实现
一、引言 分页查询是Web开发的必备功能,MyBatis生态中的PageHelper以其简单易用的特性广受欢迎。本文将从源码层面(v5.3.2)解析PageHelper的分页实现机制,结合MySQL方言展示完整的执行链路。 二、核心实现原理 1. 插件初始化 …...
MySQL中索引最左前缀法则、索引失效情况、前缀索引、索引设计原则
最左前缀法则 联合索引中,最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列,如果跳跃某一列,索引将会部分失效(后面的字段索引失效)举例假设有一个联合索引包含三个字段按顺序:…...
pdf图片导出(Visio和Origin)
一、Visio 导入pdf格式图片 1. 设计->大小,适应绘图。 2. 文件->导出,导出为pdf格式。 上面两部即可得到只包含图的部分的pdf格式。 如果出现的有默认白边,可以通过以下方式设置: 1. 文件->选项->自定义功能区->…...
NR 通讯的整体架构
前言: 并假设发射器发送了一个信号,如左下角所示(蓝色),接收器检测到的信号显示在右侧(红色)。您在图中注意到的第一件事是什么?那就是发送的信号和接收的信号并不完全相同。 有什么…...
【大模型面试每日一题】Day 26:从伦理角度,大模型可能存在哪些潜在风险?技术上如何实现内容安全控制(如RLHF、红队测试)?
【大模型面试每日一题】Day 26:从伦理角度,大模型可能存在哪些潜在风险?技术上如何实现内容安全控制(如RLHF、红队测试)? 📌 题目重现 🌟🌟 面试官:从伦理角度…...
第六届电子通讯与人工智能国际学术会议(ICECAI 2025)
在数字化浪潮中,电子通讯与人工智能的融合正悄然重塑世界的运行逻辑。技术基础的共生关系是这场变革的核心——电子通讯如同“信息高速公路”,通过5G等高速传输技术,将海量数据实时输送至AI系统,使其能够像人类神经系统般快速响应…...
深入剖析 5G 核心网中的 PLMN
一、引言 在 5G 技术迅猛发展的当下,5G 核心网作为整个通信系统的关键枢纽,支撑着海量数据传输、低延迟通信以及多样化业务应用。其中,公共陆地移动网络(Public Land Mobile Network,PLMN)扮演着极为重要的角色,它是 5G 核心网实现用户接入、网络管理以及业务提供的基础…...
佰力博科技与您探讨半导体电阻测试常用的一些方法
一、两探针法 两探针法是一种较为基础的测试方法。该方法将两根探针与半导体样品表面紧密接触,通过电源在两根探针之间施加电压,同时使用电流表测量通过样品的电流,再根据欧姆定律计算电阻。这种方法的优点在于操作简单、设备要求较低&a…...
5G 核心网中的 NPN 功能详解
引言 在 5G 技术飞速发展的今天,5G 核心网不断演进,为各类应用场景提供强大支撑。其中,NPN(Non-Public Network,非公共网络)功能作为 5G 核心网的重要特性,正逐渐崭露头角,在众多行业中发挥着关键作用。它为特定用户或组织打造专属网络环境,满足其对网络性能、安全性…...
谷歌medgemma-27b-text-it医疗大模型论文速读:多语言大型语言模型医学问答基准测试MedExpQA
《MedExpQA: 多语言大型语言模型医学问答基准测试》论文解析 一、引言 论文开篇指出大型语言模型(LLMs)在医学领域的巨大潜力,尤其是在医学问答(QA)方面。尽管LLMs在医学执照考试等场景中取得了令人瞩目的成绩&#…...
# 深入解析BERT自然语言处理框架:原理、结构与应用
深入解析BERT自然语言处理框架:原理、结构与应用 在自然语言处理(NLP)领域,BERT(Bidirectional Encoder Representations from Transformers)框架的出现无疑是一个重要的里程碑。它凭借其强大的语言表示能…...
js中encodeURIComponent函数使用场景
encodeURIComponent 是 JavaScript 中的一个内置函数,它的作用是: 将字符串编码为可以安全放入 URL 的形式。 ✅ 为什么需要它? URL 中有一些字符是有特殊意义的,比如: ? 用来开始查询参数 & 分隔多个参数 连接…...
【NLP 77、Python环境管理工具之conda】
如果你第一万次否定自己,那我希望我可以一万零一次大声称赞你 —— 25.5.22 一、什么是conda conda是一个开源的包管理系统和环境管理系统,主要用于Python语言,但也可以用于其它语言的项目 二、为什么要使用conda ① 多环境共存,多…...
替代云数据库的本地方案:MySQL+phpMyAdmin的远程管理与跨网络访问技术
文章目录 前言1. 安装MySQL2. 安装phpMyAdmin3. 修改User表4. 本地测试连接MySQL5. 安装cpolar内网穿透6. 配置MySQL公网访问地址7. 配置MySQL固定公网地址8. 配置phpMyAdmin公网地址9. 配置phpmyadmin固定公网地址 前言 对于运维来说,平时还好,一旦出门…...
Dify大语言模型应用开发环境搭建:打造个性化本地LLM应用开发工作台
文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 各位小伙伴们,大家好!今天我们要来一场技术大冒险,手把手教你如何在Linux Ubuntu系统上使用Docke…...
MySQL索引事务
索引 通过索引可以对查询操作进行优化,通过减少全表扫描,快速定位数据,原本的查询操作是对表进行遍历,如果是大表效率较低 1)注意事项 占用了更多的空间,由于生成索引需要依赖于数据结构和额外数据&…...
Seay代码审计工具
Seay代码审计工具 介绍 Seay代码审计工具是一款由国内安全研究人员"Seay"开发的源代码安全审计工具,主要用于帮助安全人员快速发现PHP代码中的安全漏洞,快速定位代码中的安全风险点。 主要功能特点 自动化审计功能 支持自动扫描PHP代码中的…...
【人工智障生成日记1】从零开始训练本地小语言模型
🎯 从零开始训练本地小语言模型:MiniGPT TinyStories(4090Ti) 🧭 项目背景 本项目旨在以学习为目的,从头构建一个完整的本地语言模型训练管线。目标是: ✅ 不依赖外部云计算✅ 完全本地运行…...
技术分享:大数据挖掘平台架构设计与行业应用实践
在数字化转型浪潮下,企业数据规模呈指数级增长。如何构建高效的数据挖掘体系,实现数据价值变现,成为技术团队面临的重要课题。本文将深入探讨大数据挖掘平台的核心架构、关键技术及行业应用实践。 一、平台架构设计 1. 数据采集层 支持多源异…...
线性Wi-Fi FEM被卷死,非线性FEM是未来?
在跑了一圈路由器客户之后,我的内心反而平静下来,被卷死的不只是Wi-Fi FEM赛道,还有家用路由器市场。 尽管路由器市场比较惨淡,不过客户还是很愿意接见我,并做更广泛的交流和探讨。一方面之前推Wi-Fi FEM的众多厂商在渐…...
OpenCV CUDA模块图像过滤------用于创建一个最小值盒式滤波器(Minimum Box Filter)函数createBoxMinFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数创建的是一个 最小值滤波器(Minimum Filter),它对图像中每个像素邻域内的像素值取最小值。常用于&…...
【MySQL】06.MySQL表的增删查改
1. insert 我们先创建一个表结构,这部分操作我们使用这张表完成我们的操作: mysql> create table student(-> id int primary key auto_increment,-> name varchar(20) not null,-> qq varchar(20) unique-> ); Query OK, 0 rows affec…...
MySQL 索引失效及其解决办法
一、前言 在数据库优化中,索引(Index)是一项至关重要的技术手段,可以显著提升查询性能。然而,在实际开发过程中,MySQL 索引并不总是如预期生效。本文将从原理出发,系统地介绍索引失效的常见场景及其解决方案,帮助开发者有效规避性能陷阱。 二、索引基础回顾 MySQL 支…...
在线时间戳(Unix TimeStamp)转换器
做了一个在线时间戳转换器,简单、好用,提供多种日期格式。 移动端友好。 目标是做一套在线工具集,时间戳转换只是第一步。 欢迎试用...
flutter 项目调试、flutter run --debug调试模式 devtools界面说明
Flutter DevTools 网页界面说明 1. 顶部导航栏 Inspector:查看和调试 Widget 树,实时定位 UI 问题。Performance-- 性能分析面板,查看帧率、CPU 和 GPU 使用情况,识别卡顿和性能瓶颈。Memory-- 内存使用和对象分配分析ÿ…...
Qt C++实现马的遍历问题
在这个项目中,我们面对的是一个基于中国象棋的马的遍历问题,使用了C++编程语言,并结合了Qt5库来实现图形界面和棋盘的绘制。以下是这个项目涉及的关键知识点: 马的移动规则:马在象棋中具有独特的“日”字形移动方式,即每次可以向前、后、左或右移动一格,然后在同一行或同…...
web第六次课后作业--使用ApiFox实现请求响应操作
一、实体参数 1.1 简单实体参数 1.2 复杂实体对象 如果请求参数比较多,通过上述的方式一个参数一个参数的接收会比较繁琐。此时,我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装,需要遵守如下规则:请求参数名…...
第十周作业
一、CSRF 1、DVWA-High等级 2、使用Burp生成CSRF利用POC并实现攻击 二、SSRF:file_get_content实验,要求获取ssrf.php的源码 三、RCE 1、 ThinkPHP 2、 Weblogic 3、Shiro...
Excel合并单元格后,如何自动批量生成序号列
1.选择整列 2.组合键:CtrlG 3.定位条件,选择“空值” 4.在第一个框中输入“MAX(”,鼠标选中A1框,后加“:”,鼠标选中前方“A1”,按“F4”绝对引用,补全右括号,后输入“1…...
数据结构 -- B树和B+树
B树 B树 5叉查找树 最少1个关键字,2个分叉 最多4个关键字,5个分叉 如何保证查找效率 (1)eg.对于5叉排序树,规定除了根节点外,任意结点都至少有3个分叉,2个关键字 (若每个结点内关…...
el-table高度自适应、数据查询后高度展示错误问题
在很多场景中我们需要实现表格的高度自适应,即不同屏幕大小下需要使用不同的高度来设置表格,那么我们应该如何实现呢? 1.el-table实现高度自适应 通过以下代码可以实现表格根据屏幕进行自适应 设置表格的高度 <el-table ref"tableD…...
unittest
1.什么是unittest? unittest是Python自带的一个单元测试框架, 它可以做单元测试, 也能用于编写和运行重复的测试工作。它给自动化测试用例开发和执行提供了丰富的断言方法, 判断测试用例是否通过, 并最终生成测试结果. 2.unittest组成 2.1 TestCase TestCase即测试…...
【Linux学习笔记】ext2文件系统的深度剖析
【Linux学习笔记】ext2文件系统的深度剖析 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】ext2文件系统的深度剖析前言一.ext2文件系统1.1宏观认识 二. Block Group三. 块组内部构成3.1 超级块&am…...
Vue 3 官方 Hooks 的用法与实现原理
Vue 3 引入了 Composition API,使得生命周期钩子(hooks)在函数式风格中更清晰地表达。本篇文章将从官方 hooks 的使用、实现原理以及自定义 hooks 的结构化思路出发,全面理解 Vue 3 的 hooks 系统。 📘 1. Vue 3 官方生…...