XZ Blog XZ Blog
首页
  • 人体姿态估计
  • 2D-3D-Lifting
  • 动作质量评估
  • 基于RGBD视觉信息的异常行为识别
  • 基于RGB视频的行为识别
  • 大模型应用
  • 网络结构

    • Transformer
    • GCN
    • Graph Transformers
    • Diffusion Model
  • 深度学习
  • 论文解读
  • 后端开发
  • Git
  • 博客搭建
  • Debug
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

xzhouzeng

@渐行。
首页
  • 人体姿态估计
  • 2D-3D-Lifting
  • 动作质量评估
  • 基于RGBD视觉信息的异常行为识别
  • 基于RGB视频的行为识别
  • 大模型应用
  • 网络结构

    • Transformer
    • GCN
    • Graph Transformers
    • Diffusion Model
  • 深度学习
  • 论文解读
  • 后端开发
  • Git
  • 博客搭建
  • Debug
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 后端开发

    • cmake介绍
    • \{}统一初始化方
    • C++11新特性
    • C++标准推荐使用标准库头文件
    • C++动态内存分配和静态的区别
    • C++类函数后面加const的作用
    • C++类和结构区别
    • C++内存区域
    • nullptr与NULL
    • priority_queue使用
    • string , cstring , string h 的区别
    • using与typedef定义别名区别
    • vector中[]和at访问区别
    • 常量指针和指针常量
    • 空类大小及相关介绍
    • 容器emplace与push操作
      • 数据结构操作——时间复杂度
      • 智能指针(Smart Pointers)
      • 最大堆的实现
    • Git

    • 博客搭建

    • Debug

    • python开发

    • 技术
    • 后端开发
    xzhouzeng
    2023-03-20
    目录

    容器emplace与push操作

    # 容器emplace与push操作

    Created: March 19, 2024 12:36 PM

    在C++标准库中,**std::stack的emplace方法是一种用于在栈顶直接构造元素的高效方式。与push方法相比,emplace**可以避免临时对象的创建和复制或移动操作,因为它直接在栈顶的内存位置构造元素,接收的参数与元素构造函数的参数相同。

    # emplace方法的用法

    假设有一个栈**std::stack<T>,其中T是栈中元素的类型。使用emplace方法,你可以直接传递构造T所需的参数,emplace会利用这些参数在栈顶就地构造一个T**类型的对象。

    # 示例

    考虑下面的示例,展示了**emplace与push**的不同:

    cppCopy code
    #include <iostream>#include <stack>#include <string>class Book {
    public:
        std::string title;
        int year;
    
        Book(const std::string& title, int year) : title(title), year(year) {
            std::cout << "Book(const std::string&, int) called\n";
        }
    
        // 拷贝构造函数
        Book(const Book& other) : title(other.title), year(other.year) {
            std::cout << "Copy constructor called\n";
        }
    
        // 移动构造函数
        Book(Book&& other) noexcept : title(std::move(other.title)), year(other.year) {
            std::cout << "Move constructor called\n";
        }
    };
    
    int main() {
        std::stack<Book> books;
    
        // 使用push结合临时对象
        books.push(Book("The C++ Programming Language", 2013));
    
        // 使用emplace直接在栈上构造对象
        books.emplace("Effective Modern C++", 2014);
    
        return 0;
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33

    在这个例子中,当使用**push时,首先会调用Book的构造函数来创建一个临时Book对象,然后这个临时对象会被拷贝(或移动,如果支持移动语义)到栈中。相反,当使用emplace时,Book**对象会直接在栈上构造,避免了额外的拷贝或移动操作。

    # 优点

    • 性能:直接在容器内存位置构造元素,减少了复制或移动操作,提高了效率。
    • 便捷性:允许直接传递构造参数给**emplace**方法,使代码更简洁。

    **emplace**方法是C++11及以后版本引入的,旨在提供更为高效的容器元素构造方式,特别是对于包含复杂对象的容器而言。

    编辑 (opens new window)
    空类大小及相关介绍
    数据结构操作——时间复杂度

    ← 空类大小及相关介绍 数据结构操作——时间复杂度→

    最近更新
    01
    VideoLLMs
    03-20
    02
    Video2Script
    12-07
    03
    多模态
    11-09
    更多文章>
    Theme by Vdoing | Copyright © 2022-2024 xzhouzeng | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式