【C++】C++11的魔法:不止右值引用,C++11赋予的编程神力

3dMax脚本类插件:不写 C++也能造“原生”工具 从plugin关键字到场景持久化,拆解 MAXScript 插件开发全流程! 阅读详情

目录

引言

1、可变模版参数

可变模版参数的使用

包扩展

emplace系列接口

2、lambda

捕捉列表

3、包装器

function

bind

结语


引言

        在上篇文章中我们学习了C++11中的部分内容,这节课我们来学习一下C++11中其他的一些很神奇的语法,当我在学完这些内容时,不得不感叹大佬的思维就是与我们这种凡人不一样。接下来我们就来了解一下吧。

1、可变模版参数

        可变模版参数,顾名思义就是可以改变模版的参数,但是并不是改变模版参数的类型,这个模版本身就已经可以做到了,这里的可变指的是参数的个数可以随意改变。

        早在C语言时期,我们就已经接触过了可变参数,很多人可能没有印象,最常见的例子就是printf这个函数,在我们使用其进行打印时,往往可以根据自己的需要选择性的打印多个内容,这种可以改变传参个数的参数类型我们就称为可变参数。

可变模版参数的使用

        C++11在之前的基础上又支持了在模版的参数列表中定义可变参数,这就叫做可变模版参数,这个可变数量的参数我们称之为参数包,存在两种参数包:模版参数包,表示零或多个模版参数;函数参数包,表示零或多个函数参数。具体写法如下

template<class ...Args>
void func(Args&&... args)
{
    sizeof...(args);    //计算一个参数包里有几个参数
    ....
}

        在模版参数列表种的某个参数前面加上三个点 “ ... ” 就表示这个参数为可变参数,三个点后根的参数包名称可以不为Args,可以是任意名称,只是使用Args是一个惯例。此外sizeof在这里有了新的用法,“sizeof...” 这种写法下的sizeof不再计算字节大小,而是计算参数包内有几个参数。

        总的来说,一个函数模版可以实例化出多个不同参数类型的函数,一个可变函数参数模版就可以实例化出多个不同参数个数的函数模版,有点类似于模版的模版。

包扩展

        包扩展,实际上不是真的将参数包扩大,而是解析出参数包的内容,将参数包展开。因为参数包本身不支持像数组一样通过下标访问,只能用包扩展的形式访问,通过设计另一个可变参数模版,模版的第一个参数为T,第二个参数为可变参数,这样一来,将原本的参数包传给该模版函数时,参数包内的第一个参数就会析出成T,剩下的参数继续被打包成参数包,通过递归的方式将所有参数依次析出,这个过程就叫包扩展。

void showlist()
{
    //编译器递归时的终止条件,当参数包为0个时,匹配这个函数
    cout << endl;
}

template<class T, class ...Args>
void showlist(T x, Args&&... args)
{
    cout << x << " ";
    //args时N个参数的参数包
    //调用showlist,参数包的第一个传给x,剩下N-1传给第二个参数包
    showlist(args...);
}

template <class ...Args>
void print(Args&&... args)
{
    showlist(args...);
}

        注意,这里判断递归终止时不能像我们之前一样,用if语句判断,如:

if(sizeof...(args) == 0)
{
    return;
}

        因为if语句的判断方式是运行时判断,但是包扩展的过程是在编译时进行的,相当于在编译时编译器就生成了多个对应的showlist函数,并且在编译时编译器是不会去运行if语句的,如果这么写相当于编译器一直找不到参数包为0时需要实例化的函数,也就一直找不到包扩展停止的条件,就会报错,所以只能显示的写一个参数为零的重载函数来结束包扩展这个过程。

emplace系列接口

        在我们对stl的学习中,有一类接口没有学过,就是emplace系列的接口,因为emplace不仅要使用右值引用(万能引用),还涉及到可变模版参数的问题,所以在没了解过这一块之前无法进行讲解,现在我们已经学完了对应的知识,可以来学一学这个接口了,看看这一系列的接口比起push和insert到底有什么优势。

push_back
emplace_back

        首先是传值方面,在传值方面emplace和push并没有区别,因为emplace_back的参数类型为万能引用类型,push_back也有适配右值引用的重载,所以无论是传左值还是右值,它们的都是采用一样的构造方式。

        区别在于,它们在直接使用一串常量时的构造方式,push_back需要先走一层隐式转换,再进行拷贝构造,而emplace_back却不需要,这是为什么呢?下文我就用push和emplace代指两个接口了。

        因为push只是一个普通的成员函数,它的数据类型在对象实例化时就已经决定了,而一串常量,这一串常量本身并不是该类型的对象,所以编译器需要先走一层隐式类型转换,将它们构造成临时对象,再用这个临时对象移动构造到原链表。但是emplace是一个可变参数模版函数,在接收常量时编译器就自动推导它们的类型,并且将它们放入参数包内,就可以直接进行构造,不用先构造临时对象。

        总结:emplace系列兼容push和insert的功能,并且在特殊场景下可以省去一次隐式类型转换并直接构造,所以emplace综合下来更好用更强大,推荐使用emplace系列接口。

2、lambda

        lambda表达式本质时一个匿名函数对象,跟普通函数不同的时他可以定义在函数内部。在语法使用层面,lambda并没有类型,它的类型由编译器自动生成以保证每个lambda的类型都不相等,都互相独立,所以一般情况下直接使用auto来接收lambda对象。

//lambda表达式的格式
[capture-list] (parameters)-> return {function body}

        lambda表达式的格式如上所示,其中capture-list表示捕捉列表,parameters为参数列表,->return为返回值类型,function body就是函数体。

捕捉列表

        lambda表达式中默认只能使用参数列表以及函数体内定义的变量,如果想要使用外层作用域中的变量就需要进行捕捉。

        第一种捕捉方式是在捕捉列表中显示的传值捕捉和传引用捕捉,捕捉的多个变量之间用逗号分隔。使用传值捕捉时,被捕捉的变量被认为是被const修饰的,无法修改值,引用捕捉可以修改。如果是定义在全局域中的变量就不用进行捕捉,可以直接使用。

        第二种捕捉方式叫隐式捕捉,直接在捕捉列表中写一个赋值符号[=]就表示隐式传值捕捉,写一个引用符号就表示隐式传引用捕捉,这样才lambda表达式中使用了哪些变量,编译器就会自动去捕捉那些变量,还可以实现混合捕捉,可以将想要传值捕捉的变量显示的写出来,此外单独写个引用符号,就可以实现指定特定变量的捕捉方式,反过来也是一样。

//传值捕捉
[a, b] (int c, int d)->int
{
    ...
}

//传引用捕捉
[&a, &b] (int c, int d)->int
{
    ...
}

//隐式捕捉
[&] (int c, int d)->int
{
    ...
}

//隐式捕捉
[=] (int c, int d)->int
{
    ...
}

//混合捕捉
[&, a] (int c, int d)->int
{
    ...
}

        lambda的原理和范围for很像,编译后从汇编指令层的角度看,压根就没用lambda和范围for这样的东西,范围for的底层是迭代器,lambda的底层是仿函数对象, 也就是说我们写了一个lambda后,编译器就会自动生成一个仿函数。

        仿函数的类名是编译器按一定的规则生成的,保证不同的lambda生成的类名不同,lambda参数/返回值/函数体就是仿函数operator()的参数/返回值/函数体,lambda的捕捉列表本质是生成的仿函数类的成员变量,也就是说捕捉列表的变量都是lambda类构造函数的实参,隐式捕捉编译器就会先检查一遍要用到哪些变量就传哪些。

3、包装器

function

        function是一个类模板,它实例化的对象可以包装存储其他的一切可调用对象,包括函数指针、仿函数、lambda、bind表达式等,存储的可调用对象统称为std::function的目标,若不含目标,则称它为空。

        函数指针、仿函数、lambda等可调用对象的类型各不相同,function的优势就是统一类型,对它们都可以进行包装,这样在很多地方就方便声明可调用对象的类型。

//function公式
std::function<R(Args...)>  f;

        R代表返回值类型,Args...代表参数列表。

        说了这么多,相信很多人都会疑惑,上面讲的这什么lambda和function的听起来感觉也没什么大用啊?在这里我就用一道算法题来证明它们的作用LCR 036. 逆波兰表达式求值 - 力扣(LeetCode)

        这道题简单来说就是求一个后缀表达式的值,在以往我们解决这种问题时,是不是经常需要列举多个if语句来判断算数符是什么?如

if ( c == '+')
{ ... }
else if (c == '-')
{ ... }
...

        但是我们刚才学了lambda表达式和function包装器,我们就可以将这种冗余的代码优化一下,利用哈希表的特性:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        map<string, function<int(int, int)>> mp = {
            {"+", [](int a, int b){return a + b;}},
            {"-", [](int a, int b){return a - b;}},
            {"*", [](int a, int b){return a * b;}},
            {"/", [](int a, int b){return a / b;}}
        };

        for (auto& str : tokens)
        {
            if (mp.count(str))
            {
                int right = st.top();
                st.pop();
                int left = st.top();
                st.pop();
                int ret = mp[str](left, right);
                st.push(ret);
            }
            else
            {
                st.push(stoi(str));
            }
        }
        return st.top();
    }
};

        先设置一个哈希表,key为string类型,用于存储运算符作为标志位,value值就为一个function包装器,因为之前说过我们本身是拿不到lambda表达式的类型的,所以只要我们给它套上一层封装,将其包装为function类型,就可以用function类型来表示它。

        这样在接下来我们每次获取tokens的字符时,就可以直接用哈希表检查其是否是运算符,如果是的话就可以直接调用哈希表里对应的lambda表达式,大大节省了代码的篇幅和复杂度,对学过lambda表达式和function的人来说整个代码也就变的通俗易懂了。

bind

        bind表达式是一个函数模版,它也是一个可调用对象的包装器,可以把它看作一个函数适配器,对可接收的可调用对象进行处理后返回一个可调用对象。

        std::bind 用于把一个已有的可调用对象(函数、成员函数、仿函数等)包装成一个新的可调用对象,其核心作用是参数绑定与重排,它的基本形式是 std::bind(可调用对象, 参数...),其中参数可以写成具体值表示固定传入,也可以写成 std::placeholders::_1、_2 等占位符表示调用新对象时由外部传入的第 N 个实参,于是新对象被调用时会把这些实参按占位符的位置填回原可调用对象,从而得到原函数的调用结果,例如 auto f = std::bind(add, 10, std::placeholders::_1); 等价于 f(x) = add(10, x),把双参数的 add 变成了单参数函数,而 std::bind(add, _2, _1) 则能交换参数顺序,得到 g(x, y) = add(y, x),因此 bind 最常见的用法就是固定部分参数、调整参数顺序、适配成员函数,以及把签名不匹配的函数改造成符合 std::function 要求的形状,从而统一存储和调用,需要注意的是现代 C++ 中这类需求大多可以用 lambda 更清晰地表达,bind 更适合参数重排或快速适配已有函数的场景。

结语

        这节课我们完成了对C++11剩余知识的学习,还剩下一个智能指针我们下一篇文章再进行讲解。不得不说C++11不愧是C++最重大的一次更新,很多新内容都非常的有用,设计也十分巧妙,学会熟练使用C++11的内容可以让我们的代码水平更上一层楼。

Intouch间接变量(扩展) 间接变量只是Intouch提供给开发者的便捷方式之一,并不是所有情况都一定要使用间接变量,有时候用条件语句或者内存变量的方式也能起到类似的作用。 阅读详情

相关推荐

海康工业相机触发模式详解:软触发 vs 外触发,在C#里如何选与用?

本文深入解析海康工业相机的软触发与外触发模式,详细比较两者的特性差异、适用场景及C#实现方法。通过海康SDK配置指南和实战代码示例,帮助开发者掌握工业相机触发模式的选择与优化技巧,提升自动化检测系统的精确性和可靠性。

weixin_42635064的博客 554

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 203

强化学习-动态规划

动态规划(dynamic programming)是程序设计算法中非常重要的内容,能够高效解决一些经典问题,例如背包问题和最短路径规划。动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到目标问题的解。动态规划会保存已解决的子问题的答案,在求解目标问题的过程中,需要这些子问题答案时就可以直接利用,避免重复计算。本章介绍如何用动态规划的思想来求解在马尔可夫决策过程中的最优策略。

qq_45481856的博客 2113

选型笔记:Type‑C 扩展坞方案评估|DP1.4 转 HDMI2.0 桥接芯片 GSV2201S@ACP

本文记录 GSV2201S 这款 DP1.4a 转 HDMI2.0 桥接芯片评估,梳理视频、HDCP、PD 集成能力,总结 Type‑C 转接 Dongle、扩展坞方案的适配边界,以及差分走线、PD 时序、HDCP 握手等高频调试问题,为 C 口视频转接方案选型提供参考。

ACP广源盛的博客 218

Claude Code 完整学习笔记

Claude Code 学习笔记摘要 Claude Code是Anthropic推出的智能编码工具,基于Claude Opus 4.5模型构建,提供跨平台支持(终端/VS Code/JetBrains/Web等)。核心功能包括: 代码库理解与多文件编辑 命令执行与开发工具集成 智能体协作开发流程 安装要求Node.js≥18,提供原生/Homebrew/npm等多种安装方式,支持环境变量配置API访问。基础交互模式包括会话管理、文件操作和代码审查等功能,可自动读写文件并执行精确修改。 (149字)

虚心若愚 810

AI学习指南RAG篇(19)-API调用与集成

通过上述API调用示例,您可以方便地将RAGFlow与其他系统集成,实现数据集管理、文档处理、会话管理等功能。希望本文的介绍能帮助您更好地理解和使用RAGFlow的API。

俞兆鹏的博客 2544

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 332

微信小程序 - 实现嵌套H5页面唤起微信支付的实现方案+完整流程源码,微信小程序webview(H5页面)调用微信小程序支付,嵌套h5页面怎么实现小程序支付(Vue2/3移动端H5网页、公众号网页等)

h5嵌入微信小程序微信支付,H5网页嵌入到微信小程序内如何支付,微信小程序webview组件交互,内联h5页面并网页实现微信支付,微信H5页面实现微信小程序支付,微信小程序嵌套webview实现小程序微信支付,小程序中内嵌H5网页支付怎么办,用网页的支付还是小程序的支付?支付没反应,支付报错怎么办,微信小程序内嵌h5,h5调用小程序支付功能解决方案,H5网页cors跨域,真机测试无法唤起支付,无法唤起支付,uniapp微信小程序,h5小程序调用微信支付,微信小程序内嵌H5页面,如何实现微信支付功能,微信小程

🏆 前端领域优质创作者 1万+

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 388

vue2/3 - [超详细] 实现企业微信扫码登录完整流程及代码,vue项目接入企业微信扫码登录功能教程,支持新跳页显示二维码或div容器里内嵌登录二维码(详细代码注释,一键复制开箱即用)

vue企业微信扫码登录,vue网页网站企业微信扫码登录教程,vue如何实现企业微信扫码登录功能,vue详细企业微信扫码登录功能实现,vue2实现企业微信扫码登录,前端vue企业微信扫码登录教程,vue pc电脑端企业微信扫码登录详细教程,vue项目中怎么做企业微信扫码注册登录,vue实现网站接入企业微信扫码登录,vue2做企业微信扫码登录的优质文章教程,vue网站对接企业微信扫码登录,vue企业微信扫码登录如何新开一页全屏显示登录二维码,vue企业微信登录二维码 内嵌在div容器里/跳页显示登录二维码,vu

✅ 精选推荐文章 5701

【ComfyUI报错解决】K采样器 mat1和mat2形状不匹配错误分析与修复 mat1 and mat2 shapes cannot be multiplied (77x2048 and 4096x

如果你在 ComfyUI 里遇到K采样器报错:mat1 和 mat2 shapes cannot be multiplied确认大模型和 LoRA 是否是同一版本(SDXL vs SD1.5,不能混用)。如果用了双 CLIP 加载器,要确认加载的类型和选择的模型类型是否匹配。加载→ 类型选flux加载 SDXL 专用的 clip/t5 → 类型选sdxl避免不同版本模型和 LoRA 混搭,保持一致性。模型+LoRA+CLIP 类型必须保持同一版本,不然就会报错。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2407

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析

蓝桥杯报名正在火热进行(软件赛报名 2026-10-08—12-18,省赛 2027-04-10),电子学会 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名也已开启(9/23—12/2),全国青少年信息素养大赛算法应用主题赛同步推进——把 LCA 这个模板练熟,正是冲刺这些赛事树型考点的关键一步。所谓「最近公共祖先」:在一棵以某个节点为根的树里,两个节点 u、v 向上追溯,最早交汇的那个祖先就叫它们的 LCA。比如家谱里,你和你表哥最近的共同长辈就是你们的祖父。

IT_Scratch的博客 533

基于高光谱的物质反演与分类 — 技术文章(原理详解 + 深度代码实现)

高光谱遥感 / 近场光谱采集产生逐像素上百波段的光谱曲线,是物质识别与定量反演(abundance / composition estimation)和语义分类(landcover / material class)的一把利器。本文第一部分对常用模型(线性混合模型、非线性辐射传输、稀疏反演、降维与特征选择、分类器/神经网络)进行数学推导与理论分析;第二部分给出两套完整实现:A. 基于 LMM 的约束最小二乘 / 稀疏反演流水线(含端到端评估);

VectorShift的博客 219

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 342

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 376

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 301

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 435

C++ 求抛物线的顶点、焦点和准线(Finding the vertex, focus and directrix of a parabola)

已知抛物线方程 $ y = ax^2 + bx + c $,可利用公式求其顶点、焦点和准线。顶点为 $ \left( -\frac{b}{2a}, \frac{4ac - b^2}{4a} \right) $,焦点为 $ \left( -\frac{b}{2a}, \frac{4ac - b^2 + 1}{4a} \right) $,准线方程为 $ y = c - \frac{b^2 + 1}{4a} $。以 $ a=5, b=3, c=2 $ 为例,计算得顶点 $(-0.3, 1.55)$,焦点 $(-0

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 163

c++ 超级大坑未定义行为如何避免(下)

尤其是通过。

拒绝AI文,努力在AI时代写出感动人心的好文章 141

C 语言指针与输入输出

指针是 C 语言的魂,输入输出是和人交互的入口。这篇文章把"变量在内存里到底长什么样"讲透,接着用代码验证原码/反码/补码为什么非用补码不可,再拿进制转换、数组、printf/scanf 的格式符收尾。所有输出都是本机 gcc 真实跑出来的。

2401_89953644的博客 159

从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架

人机共存”正逐渐成为家用 UV-C 空气消毒产品的核心卖点。其中一类常见结构,是把 254 nm 紫外线灯置于吊扇扇叶上方,以扇叶盘作为物理遮挡,同时借助风扇强制对流实现空气循环消毒。专利文献对该结构的意图描述相当清晰:消毒平台遮挡紫外线灯朝下发出的光,使光线射向天花板,从而“不会让紫外线辐射到位于吊扇灯下方的用户”。然而,“结构上不直射”与“工程上安全且有效”之间,仍隔着一段需要实测数据来填补的距离。

HANDY09200的博客 693

【C++】【STL】string_OJ题

本文总结了9道C++ STL中关于string的OJ题目,按操作类型分为三组:反转与就地修改(如917、541、151)、计数与查找(如387、125、58)、模拟与大数运算(如415、43、8)。核心技巧包括双指针收敛、字符分类处理、进位控制及边界值处理。所有题目使用同一套源码,在标准库std::string与自定义容器MyString间切换仅需宏定义,验证结果一致性。代码通过随机测试用例与Trace函数逐行比对,确保逻辑正确性,强调接口对齐的重要性。

这里是Cocatrice的博客,感谢大家一直以来的支持和鼓励,如果对C/C++方向感兴趣的话,可以通过主页的微信名片加Cocatrice的好友,也可以通过邮箱:Chen31980094@163.com 联系,一同加油! 4367

C 语言 malloc() 详解与实战 Demo

本文详解C语言malloc()函数,涵盖其语法、内存原理及实战应用。通过动态整数、数组、结构体与链表的Demo,演示如何安全申请、使用与释放内存,强调避免内存泄漏与空指针检查的重要性,帮助开发者掌握动态内存管理核心技能。

tangPHP的博客 365

【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针

C++类与对象知识(面向过程和面向对象的初步认识,类的初步认识,类的访问限定符及封装,类的作用域、实例化,类的对象模型,this指针)

2601_96587588的博客 872

【C++ 基础入门】C++继承(下):问题、底层原理与组合

C++继承(菱形继承的问题、虚继承原理、继承与组合、构造顺序)

2601_96587588的博客 746

C++09_vector类复习

本文以10个核心问题为主线,系统解析C++ vector的底层机制:从基本概念、初始化方式、遍历方法,到size与capacity的区别、扩容策略(VS 1.5×,g++ 2×)、reserve与resize差异、中间增删的挪动原理、迭代器失效原因,直至二维vector的内存布局(含三指针结构)。通过“先会用、再懂扩容、最后看清对象结构”的递进逻辑,揭示vector作为动态数组的本质——连续内存、自动扩容、随机访问高效,但插入删除代价高,迭代器易失效。全文深入浅出,助读者摆脱“黑盒”认知,真正掌握其内存图景

lemo_n_的博客 337

cargo bench 快速上手

是 Rust 内置的基准测试命令,用于。不过,Rust 标准库的#[bench]属性目前仅在版本可用,因此在稳定版(stable)上,社区标准做法是使用框架。

Doublelv 的博客专栏。 339
上一篇: 【力扣刷题】第二天:无重复字符的最长字串、移动零问题
下一篇: 【Linux】揭开文件神秘的面纱:第一讲,重定向背后的秘密
虚无的纽扣
博客等级 码龄1年 405粉丝 36原创
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值