跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++11 右值引用、移动语义及 Lambda 表达式详解

探讨 C++11 中右值引用与移动语义在容器传参中的优化机制,通过自定义 List 类演示 push_back 接口的左值与右值重载实现资源转移。代码展示了如何通过 move 保持右值属性以调用移动构造,避免不必要的深拷贝开销。同时介绍了 Lambda 表达式的基础语法结构、应用场景、捕捉列表及原理概述,帮助开发者理解现代 C++ 的高效编程模式。

晚风叙旧发布于 2026/2/5更新于 2026/10/232.9K 浏览
C++11 右值引用、移动语义及 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) -- 移动构造

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

// List.h
# 

  std;

 bit {
    < >
      {
        ListNode<T>* _next;
        ListNode<T>* _prev;
        T _data;
        
        ( T& data = ()) :_next(), _prev(), _data(data) {}
        
        (T&& data) 
            :_next(), _prev(), _data((data)) {}
    };

    < ,  ,  >
      {
         ListNode<T> Node;
         ListIterator<T, Ref, Ptr> Self;
        Node* _node;
        
        (Node* node) :_node(node) {}
        
        Self& ++() {
            _node = _node->_next;
             *;
        }
        
        Ref *() {  _node->_data; }
        
         !=( Self& it) {  _node != it._node; }
    };

    < >
      {
         ListNode<T> Node;
    :
         ListIterator<T, T&, T*> iterator;
         ListIterator<T,  T&,  T*> const_iterator;
        
        {  (_head->_next); }
        {  (_head); }
        
        {
            _head =  ();
            _head->_next = _head;
            _head->_prev = _head;
        }
        
        () { (); }
        
        
        { ((), x); }
        
        
        { ((), (x)); }
        
        {
            Node* cur = pos._node;
            Node* newnode =  (x);
            Node* prev = cur->_prev;
            prev->_next = newnode;
            newnode->_prev = prev;
            newnode->_next = cur;
            cur->_prev = newnode;
             (newnode);
        }
        
        {
            Node* cur = pos._node;
            Node* newnode =  ((x));
            Node* prev = cur->_prev;
            prev->_next = newnode;
            newnode->_prev = prev;
            newnode->_next = cur;
            cur->_prev = newnode;
             (newnode);
        }
        
    :
        Node* _head;
    };
}




{
    bit::list<bit::string> lt;
    cout <<  << endl;
    ;
    lt.(s1);
    cout <<  << endl;
    lt.(bit::());
    cout <<  << endl;
    lt.();
    cout <<  << endl;
    lt.((s1));
    cout <<  << endl;
     ;
}
include
<iostream>
#include <utility>
using
namespace
namespace
template
class
T
struct
ListNode
ListNode
const
T
nullptr
nullptr
ListNode
// 这里不需要给缺省值,有缺省值的构造函数是默认构造函数,一个类里面只能有一个默认构造函数
nullptr
nullptr
move
template
class
T
class
Ref
class
Ptr
struct
ListIterator
typedef
typedef
ListIterator
operator
return
this
operator
return
bool
operator
const
return
template
class
T
class
list
typedef
public
typedef
typedef
const
const
iterator begin()
return
iterator
iterator end()
return
iterator
void empty_init()
new
Node
list
empty_init
// 左值版本
void push_back(const T& x)
insert
end
// 右值版本
void push_back(T&& x)
insert
end
move
iterator insert(iterator pos, const T& x)
new
Node
return
iterator
iterator insert(iterator pos, T && x)
new
Node
move
return
iterator
private
// Test.cpp
#include "List.h"
int main()
"*************************"
bit::string s1("111111111111111111111")
push_back
"*************************"
push_back
string
"22222222222222222222222222222"
"*************************"
push_back
"3333333333333333333333333333"
"*************************"
push_back
move
"*************************"
return
0

四、Lambda

1. Lambda 表达式语法

2. Lambda 的应用

3. 捕捉列表

4. Lambda 的原理

目录

  1. (4)右值引用和移动语义在传参中的提效
  2. 四、Lambda
  3. 1. Lambda 表达式语法
  4. 2. Lambda 的应用
  5. 3. 捕捉列表
  6. 4. Lambda 的原理

更多推荐文章

查看全部
  • Stable Diffusion 原理解析与本地部署实战
  • 2026 年 AI 大数据、大模型、AIGC 与云计算就业趋势分析
  • Flutter eip55 库在鸿蒙系统的以太坊地址校验适配指南
  • AI Agent 开发:知识图谱与 Neo4j 实战指南(一)
  • 前端文本测量瓶颈突破:Pretext 纯 TypeScript 用户态引擎
  • 基于 Gemini 3 Pro Image 模型的 AI 科研绘图实测:机制图与技术路线图生成
  • OpenCode 接入 Kimi K2.5 配置与实战指南
  • SystemVerilog 全面教程:从基础到高级验证
  • Linux 系统 Git 安装配置与常见问题排查
  • Stable Diffusion WebUI 部署与核心功能实战
  • AI Agent 架构:基础组成模块深度解析
  • LocalAI 本地部署与 cpolar 远程访问配置教程
  • Python 数据分析实战:分类分析与决策树实现
  • OpenManus 开源自主规划智能体详解
  • OpenClaw 自托管 AI 管家安装与配置指南
  • Java 数据结构:树形结构与二叉树详解
  • 前端数据库 IndexedDB 详解:构建离线 Web 应用
  • 使用 ZeroNews 远程管理 OpenClaw Gateway Dashboard
  • AIGC 重塑文学创作:机遇、挑战与应对
  • 二叉树算法实战:美国血统与深度宽度计算

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online