当前位置: 首页 > article >正文

c++ emplace

1、emplac 介绍

在 C++ 中,emplace 系列函数(如 emplace_back, emplace, emplace_front 等)是 STL 容器的一组成员函数,提供了一种高效的对象插入方式。与 push_backinsert 不同,emplace 可以直接在容器中原地构造对象,而不是构造一个对象后再复制或移动到容器中。

emplacepush 的区别

  1. push_backinsert

    • 需要构造一个临时对象,然后将该对象复制或移动到容器中。
    • 如果对象比较复杂,构造临时对象后再插入容器中会有额外的开销。
  2. emplace_backemplace

    • 直接在容器内部构造对象,避免了额外的复制或移动操作。
    • 更加高效,特别是在构造临时对象的开销较大的情况下。

使用 emplace 的优势

  • 性能优化emplace 可以避免创建临时对象,并且在某些情况下可以显著提升性能,尤其是当插入的对象较复杂时(如含有多个构造参数的对象)。
  • 代码简洁emplace 提供了更简洁的语法,直接传递构造函数的参数,无需显式地创建对象。

功能总结

  • emplace 系列函数通过在容器内原地构造对象来提高性能,特别是当对象的构造和复制代价较高时。
  • 相比于 push_backinsertemplace 更加高效,因为它避免了临时对象的构造、复制或移动。
  • 常见的 emplace 函数有:emplace, emplace_back, emplace_front,不同容器会提供不同的 emplace 函数,根据容器特性来使用。

2、emplace使用方法

emplace 及其相关函数(如 emplace_back, emplace_front, emplace_hint 等)是 C++ 标准库的一部分,具体提供于以下库中:

  1. <vector>

    • std::vector::emplace_back: 用于在 vector 的末尾插入新元素,原地构造对象。
  2. <deque>

    • std::deque::emplace_back: 用于在 deque 的末尾插入新元素,原地构造对象。
    • std::deque::emplace_front: 用于在 deque 的前面插入新元素,原地构造对象。
  3. <list>

    • std::list::emplace_back: 用于在 list 的末尾插入新元素,原地构造对象。
    • std::list::emplace_front: 用于在 list 的前面插入新元素,原地构造对象。
  4. <map><set>

    • std::map::emplace: 用于在 map 中插入新键值对,原地构造对象。
    • std::set::emplace: 用于在 set 中插入新元素,原地构造对象。
  5. <unordered_map><unordered_set>

    • std::unordered_map::emplace: 用于在无序映射中插入新键值对,原地构造对象。
    • std::unordered_set::emplace: 用于在无序集合中插入新元素,原地构造对象。
  6. 使用示例

#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>

struct Point {
    int x, y;
    Point(int a, int b) : x(a), y(b) {}
};

int main() {
    // 使用 std::vector 的 emplace_back
    std::vector<Point> points;
    points.emplace_back(1, 2);
    points.emplace_back(3, 4);

    // 使用 std::list 的 emplace_front
    std::list<Point> pointList;
    pointList.emplace_front(5, 6);
    pointList.emplace_front(7, 8);

    // 使用 std::map 的 emplace
    std::map<int, std::string> m;
    m.emplace(1, "one");
    m.emplace(2, "two");

    // 使用 std::set 的 emplace
    std::set<std::pair<int, int>> s;
    s.emplace(1, 2);
    s.emplace(3, 4);

    // 使用 std::unordered_map 的 emplace
    std::unordered_map<int, std::string> um;
    um.emplace(1, "one");
    um.emplace(2, "two");

    // 输出结果
    for (const auto& p : points) {
        std::cout << "Point(" << p.x << ", " << p.y << ")\n";
    }
    
    for (const auto& p : pointList) {
        std::cout << "Point(" << p.x << ", " << p.y << ")\n";
    }

    for (const auto& pair : m) {
        std::cout << pair.first << ": " << pair.second << "\n";
    }

    for (const auto& pair : s) {
        std::cout << "Pair(" << pair.first << ", " << pair.second << ")\n";
    }

    for (const auto& pair : um) {
        std::cout << pair.first << ": " << pair.second << "\n";
    }

    return 0;
}
 


http://www.kler.cn/news/343750.html

相关文章:

  • 掌握 Vue.js 中的 Axios:解密字符串插值和 URL 构建20241011
  • 小程序配置文件
  • 解决linux中pip速度过慢问题
  • 【网络安全】将两个 Self-XSS 转变为可利用的 XSS
  • 如何用ChatGPT 8小时写出一篇完整论文(附完整提示词)
  • Chrome清除nslookup解析记录 - 强制http访问 - 如何禁止chrome 强制跳转https
  • 计算机挑战赛2
  • 【java】windows系统-让tomcat开机自启、后台启动
  • Nginx的正向与反向代理
  • linux与window中的脚本编写技巧
  • 尚游深圳 客户端开发笔试题 2024
  • Flutter多语言适配
  • mongodb GUI工具(NoSQLBooster)
  • [Notes] 3DGS Features Summary
  • 基于机器视觉的水果品质检测研究进展
  • 3_路由器分组交换知多少?20241009
  • 吴恩达深度学习笔记(一)-基础知识
  • Qt 数据库,人脸识别
  • Go-知识依赖GOPATH
  • 经纪人项目开发及知识点总结