c++ emplace
1、emplac 介绍
在 C++ 中,emplace
系列函数(如 emplace_back
, emplace
, emplace_front
等)是 STL 容器的一组成员函数,提供了一种高效的对象插入方式。与 push_back
或 insert
不同,emplace
可以直接在容器中原地构造对象,而不是构造一个对象后再复制或移动到容器中。
emplace
和 push
的区别
-
push_back
和insert
:- 需要构造一个临时对象,然后将该对象复制或移动到容器中。
- 如果对象比较复杂,构造临时对象后再插入容器中会有额外的开销。
-
emplace_back
或emplace
:- 直接在容器内部构造对象,避免了额外的复制或移动操作。
- 更加高效,特别是在构造临时对象的开销较大的情况下。
使用 emplace
的优势
- 性能优化:
emplace
可以避免创建临时对象,并且在某些情况下可以显著提升性能,尤其是当插入的对象较复杂时(如含有多个构造参数的对象)。 - 代码简洁:
emplace
提供了更简洁的语法,直接传递构造函数的参数,无需显式地创建对象。
功能总结
emplace
系列函数通过在容器内原地构造对象来提高性能,特别是当对象的构造和复制代价较高时。- 相比于
push_back
和insert
,emplace
更加高效,因为它避免了临时对象的构造、复制或移动。 - 常见的
emplace
函数有:emplace
,emplace_back
,emplace_front
,不同容器会提供不同的emplace
函数,根据容器特性来使用。
2、emplace使用方法
emplace
及其相关函数(如 emplace_back
, emplace_front
, emplace_hint
等)是 C++ 标准库的一部分,具体提供于以下库中:
-
<vector>
:std::vector::emplace_back
: 用于在vector
的末尾插入新元素,原地构造对象。
-
<deque>
:std::deque::emplace_back
: 用于在deque
的末尾插入新元素,原地构造对象。std::deque::emplace_front
: 用于在deque
的前面插入新元素,原地构造对象。
-
<list>
:std::list::emplace_back
: 用于在list
的末尾插入新元素,原地构造对象。std::list::emplace_front
: 用于在list
的前面插入新元素,原地构造对象。
-
<map>
和<set>
:std::map::emplace
: 用于在map
中插入新键值对,原地构造对象。std::set::emplace
: 用于在set
中插入新元素,原地构造对象。
-
<unordered_map>
和<unordered_set>
:std::unordered_map::emplace
: 用于在无序映射中插入新键值对,原地构造对象。std::unordered_set::emplace
: 用于在无序集合中插入新元素,原地构造对象。
- 使用示例
#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;
}