emplace
和 emplace_back
是 C++ 标准库容器中用于插入元素的成员函数,它们的主要区别体现在使用场景、参数传递和应用容器上,下面为你详细介绍:
1. 使用场景
emplace
:适用于关联容器(如std::set
、std::map
)和顺序容器(如std::vector
、std::list
),可以在容器的任意位置插入元素。emplace_back
:专门用于顺序容器(如std::vector
、std::list
、std::deque
),它会在容器的尾部插入元素。
2. 参数传递
emplace
:接受用于构造元素的参数,它会在容器内部直接构造元素。你可以传入构造元素所需的参数,而不是一个已经构造好的对象。emplace_back
:同样接受用于构造元素的参数,直接在容器的尾部构造元素。
3. 代码示例
#include <iostream>
#include <vector>
#include <map>
class MyClass {
public:
MyClass(int value) : data(value) {
std::cout << "Constructed with value: " << data << std::endl;
}
int data;
};
int main() {
// 使用 emplace 插入元素到 vector 中
std::vector<MyClass> vec;
std::cout << "Using emplace in vector:" << std::endl;
vec.emplace(vec.begin(), 1);
// 使用 emplace_back 插入元素到 vector 中
std::cout << "\nUsing emplace_back in vector:" << std::endl;
vec.emplace_back(2);
// 使用 emplace 插入元素到 map 中
std::map<int, MyClass> myMap;
std::cout << "\nUsing emplace in map:" << std::endl;
myMap.emplace(1, 100);
return 0;
}
4. 代码解释
emplace
:在std::vector
中,可以指定插入位置,这里使用vec.emplace(vec.begin(), 1)
在容器开头插入元素。在std::map
中,使用myMap.emplace(1, 100)
插入一个键值对,直接构造元素。emplace_back
:在std::vector
中,使用vec.emplace_back(2)
在容器尾部插入元素。
总结
- 如果你需要在容器的特定位置插入元素,或者使用关联容器,应该使用
emplace
。 - 如果你只是想在顺序容器的尾部插入元素,使用
emplace_back
会更简洁。