【C++】第二十六节—C++11(中) | 右值引用和移动语义(续集)+lambda

【C++】第二十六节—C++11(中) | 右值引用和移动语义(续集)+lambda

Hi,我是云边有个稻草人,C++领域博主与你分享专业知识(*^▽^*)

《C++》本篇文章所属专栏—持续更新中—欢迎订阅~

目录

上节总览,详情见—>【C++】第二十五节—C++11 (上) | 详解列表初始化+右值引用和移动语义

本节总览

(4)右值引用和移动语义在传参中的提效

6. 类型分类

7. 引用折叠

8. 完美转发

四、lambda

1. lambda表达式语法

2. lambda的应用

3. 捕捉列表

4. lambda的原理


接着上节,正文开始——

(4)右值引用和移动语义在传参中的提效
  • 查看STL文档我们发现C++11以后容器的push和insert系列的接口否增加的右值引用版本
  • 当实参是一个左值时,容器内部继续调用拷贝构造进行拷贝,将对象拷贝到容器空间中的对象
  • 当实参是一个右值,容器内部则调用移动构造,右值对象的资源到容器空间的对象上
  • 把我们之前模拟实现的list拷贝过来,支持右值引用参数版本的push_back和insert
  • 其实这里还有一个emplace系列的接口,但是这个涉及可变参数模板,我们需要把可变参数模板讲 解以后再讲解emplace系列的接口。
// void push_back (const value_type& val); // void push_back (value_type&& val); // iterator insert (const_iterator position, value_type&& val); // iterator insert (const_iterator position, const value_type& val); int main() { std::list<bit::string> lt; bit::string s1("111111111111111111111"); lt.push_back(s1); cout << "*************************" << endl; lt.push_back(bit::string("22222222222222222222222222222")); cout << "*************************" << endl; lt.push_back("3333333333333333333333333333"); cout << "*************************" << endl; lt.push_back(move(s1)); cout << "*************************" << endl; return 0; } //可以自己分析一下运行结果 运行结果: string(char* str) string(const string& s) -- 拷贝构造 ************************* string(char* str) string(string&& s) -- 移动构造 ~string() -- 析构 ************************* string(char* str) string(string&& s) -- 移动构造 ~string() -- 析构 ************************* string(string&& s) -- 移动构造 ************************* ~string() -- 析构 ~string() -- 析构 ~string() -- 析构 ~string() -- 析构 ~string() -- 析构

下面是自己实现 list 的右值版本的push_back。注意右值在层层传递的时候属性的变化,要move保持其右值属性才能调用移动构造

// List.h // 以下代码把跟这里无关的接口都删除了,精简版 namespace bit { template<class T> struct ListNode { ListNode<T>* _next; ListNode<T>* _prev; T _data; ListNode(const T& data = T()) :_next(nullptr) , _prev(nullptr) , _data(data) { } ListNode(T&& data)//这里不需要给缺省值,有缺省值的构造函数是默认构造函数,一个类里面只能有一个默认构造函数 :_next(nullptr) , _prev(nullptr) , _data(move(data)) { } }; template<class T, class Ref, class Ptr> struct ListIterator { typedef ListNode<T> Node; typedef ListIterator<T, Ref, Ptr> Self; Node* _node; ListIterator(Node* node) :_node(node) { } Self& operator++() { _node = _node->_next; return *this; } Ref operator*() { return _node->_data; } bool operator!=(const Self& it) { return _node != it._node; } }; template<class T> class list { typedef ListNode<T> Node; public: typedef ListIterator<T, T&, T*> iterator; typedef ListIterator<T, const T&, const T*> const_iterator; iterator begin() { return iterator(_head->_next); } iterator end() { return iterator(_head); } void empty_init() { _head = new Node(); _head->_next = _head; _head->_prev = _head; } list() { empty_init(); } //左值版本 void push_back(const T& x) { insert(end(), x); } //右值版本 void push_back(T&& x) { insert(end(), move(x)); } iterator insert(iterator pos, const T& x) { Node* cur = pos._node; Node* newnode = new Node(x); Node* prev = cur->_prev; // prev newnode cur prev->_next = newnode; newnode->_prev = prev; newnode->_next = cur; cur->_prev = newnode; return iterator(newnode); } iterator insert(iterator pos, T && x) { Node* cur = pos._node; Node* newnode = new Node(move(x)); Node* prev = cur->_prev; // prev newnode cur prev->_next = newnode; newnode->_prev = prev; newnode->_next = cur; cur->_prev = newnode; return iterator(newnode); } private: Node* _head; }; } // Test.cpp #include"List.h" int main() { bit::list<bit::string> lt; cout << "*************************" << endl; bit::string s1("111111111111111111111"); lt.push_back(s1); cout << "*************************

Read more

告别996:GitHub Copilot将我的开发效率提升300%的实战记录

告别996:GitHub Copilot将我的开发效率提升300%的实战记录

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕AI这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * 告别996:GitHub Copilot将我的开发效率提升300%的实战记录 * 引言:从疲惫到高效 * 什么是GitHub Copilot?🤖 * 效率提升300%的核心场景 * 1. 快速生成样板代码 * 2. 自动编写单元测试 * 3. 智能调试与注释 * 集成Copilot到工作流 * 步骤1:设置合理的期望 * 步骤2:结合IDE使用 * 步骤3:代码审查与调整 * 高级用法:超越代码生成 * 数据库查询优化 * API接口设计 * 正则表达式助手 * 数据支撑:效率提升分析 * 避坑指南:常见问题与解决 * 1. 可能生成过时或不安全代码

By Ne0inhk
GTC2026前瞻(二)Agentic AI 与开源模型篇+(三)Physical AI 与机器人篇

GTC2026前瞻(二)Agentic AI 与开源模型篇+(三)Physical AI 与机器人篇

(二)Agentic AI 与开源模型篇 Agentic AI与开源模型:英伟达想定义的,不只是“更聪明的模型”,而是“能持续工作的数字劳动力” 如果说过去两年的大模型竞赛,核心问题还是“谁能生成更像人的答案”,那么到了 GTC 2026,问题已经明显变了。英伟达把 Agentic AI 直接列为大会四大核心主题之一,官方对这一主题的定义也很明确:重点不再是单轮问答,而是让 AI agent 能够推理、规划、检索并执行动作,最终把企业数据转化为可投入生产的“数字劳动力”。这说明,Agentic AI 在英伟达的语境里,已经不是一个前沿概念,而是下一阶段 AI 商业化的主战场。(NVIDIA) 一、GTC 2026真正的变化,是 AI 开始从“会回答”走向“会做事”

By Ne0inhk
GitHub CLI 安装指南

GitHub CLI 安装指南

GitHub CLI 是 GitHub 官方提供的命令行工具,可以帮助开发者方便地与 GitHub 平台进行交互,例如克隆仓库、提交代码、创建 Pull Request 等。 相比传统的 HTTPS 下载和操作,GitHub CLI 提供了以下显著的优势和特殊功能: GitHub CLI 的优势 1. 快速交互 GitHub 功能: * 不仅支持克隆仓库,还可以直接通过命令行创建 Issue、合并 Pull Request、管理 GitHub Actions 等操作。 * 节省了在 GitHub 网站和本地终端之间切换的时间。 2. 增强的身份验证支持: * 提供更安全的登录方式,支持 OAuth 和 SSH,不再需要手动输入用户名和密码。 * 支持 Personal

By Ne0inhk

CAM++智能家居:个性化语音助手的声纹唤醒机制

CAM++智能家居:个性化语音助手的声纹唤醒机制 1. 引言 随着智能家居设备的普及,用户对语音助手的安全性与个性化需求日益增长。传统语音唤醒系统往往依赖关键词检测(如“嘿 Siri”),但难以区分不同说话人,存在隐私泄露和误触发风险。为解决这一问题,基于声纹识别的个性化语音助手逐渐成为研究热点。 CAM++ 是由科哥开发的一套高性能说话人验证系统,其核心是 DAMO 团队提出的 CAM++(Context-Aware Masking++)模型,具备高精度、低延迟的特点,特别适用于资源受限的边缘设备。该系统不仅能判断两段语音是否来自同一说话人,还可提取 192 维的声纹特征向量(Embedding),为构建个性化的智能语音交互系统提供了坚实基础。 本文将深入解析 CAM++ 在智能家居场景下的应用逻辑,重点剖析其声纹唤醒机制的设计原理、工程实现路径以及优化策略,帮助开发者理解如何将其集成到实际产品中,打造真正“懂你”的语音助手。 2. 技术原理深度解析 2.1 声纹识别的本质与挑战 声纹识别(Speaker Verification)

By Ne0inhk