自学内容网 自学内容网

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;
}
 


原文地址:https://blog.csdn.net/weixin_43881088/article/details/142861290

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!