emplace c++详解
在C++11中引入了两个新的成员函数emplace
和emplace_back
来替代push_back
在STL容器中插入元素的方式。这两个函数的设计目的是直接在容器内构造元素,避免了多次拷贝的开销,提高了性能。
emplace函数的使用
emplace
函数的作用是在容器中直接构造一个元素,而不是先创建一个临时对象再插入容器。这样省去了创建临时对象、拷贝对象的开销,同时也更加灵活。
emplace
函数的语法如下:
container.emplace(iterator_position, args...);
其中container
是容器名称,iterator_position
是插入的位置,args...
是传递给构造函数的参数。
下面以vector
为例进行演示。
#include <iostream>
#include <vector>
struct Foo {
int x;
Foo(int n) : x(n) {
std::cout << "Foo constructed with " << x << std::endl;
}
};
int main() {
std::vector<Foo> vec;
// 使用emplace_back插入元素
vec.emplace_back(10);
vec.emplace_back(20);
return 0;
}
在上面的示例中,我们定义了一个Foo
结构体,并在其中定义了一个带有整数参数的构造函数。然后在main
函数中,我们使用emplace_back
函数分别插入元素10和20到vector
容器中。
运行上面的代码,将会得到如下输出:
Foo constructed with 10
Foo constructed with 20
可以看到,emplace_back
函数直接在容器中构造元素,而不需要额外的拷贝操作。
emplace_back函数的使用
emplace_back
函数与emplace
函数类似,也是在容器末尾直接构造一个元素。语法如下:
container.emplace_back(args...);
其中container
是容器名称,args...
是传递给构造函数的参数。
下面我们继续以vector
为例进行演示。
#include <iostream>
#include <vector>
struct Bar {
int y;
Bar(int n) : y(n) {
std::cout << "Bar constructed with " << y << std::endl;
}
};
int main() {
std::vector<Bar> vec;
// 使用emplace函数插入元素
vec.emplace_back(30);
vec.emplace_back(40);
return 0;
}
在上面的示例中,我们定义了一个Bar
结构体,并在其中定义了一个带有整数参数的构造函数。然后在main
函数中,我们使用emplace
函数分别插入元素30和40到vector
容器中。
运行上面的代码,我们将会得到如下输出:
Bar constructed with 30
Bar constructed with 40
同样地,emplace_back
函数也直接在容器中构造元素,而不需要额外的拷贝操作。
总结
通过本文的介绍,我们了解了emplace
和emplace_back
函数的用法及其优势。在实际应用中,我们可以根据需要选择合适的函数来插入元素,以提高代码的效率和性能。