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;
}
更多推荐
所有评论(0)