📅  最后修改于: 2023-12-03 14:39:52.814000             🧑  作者: Mango
在C++标准模板库(STL)中,vector是一个非常有用的数据结构,它可以动态地增长或缩小数组大小,使得我们可以在需要的时候对数组进行操作。emplace_back是vector类中的一个成员函数,它的作用是在vector的末尾插入一个元素,而不是在vector的末尾附加一个元素。
template< class... Args >
void emplace_back( Args&&... args );
Args:要插入的元素的类型和其构造函数所需的参数。
无
将args构造的对象直接插入到vector的结尾位置,无需进行额外的拷贝构造或移动构造。如果args是临时对象,则vector将在单个操作中构造并插入该对象。
下面是一个使用emplace_back的简单示例:
#include <iostream>
#include <vector>
int main()
{
std::vector<std::pair<int, std::string>> vec;
vec.emplace_back(1, "one");
vec.emplace_back(2, "two");
vec.emplace_back(3, "three");
for (auto& i : vec)
std::cout << i.first << " " << i.second << std::endl;
return 0;
}
输出:
1 one
2 two
3 three
在上面的例子中,我们使用std::pair<int, std::string>作为元素类型,使用emplace_back在vector结尾插入多个元素。第一个参数是int类型,第二个参数是std::string类型。
由于emplace_back不执行额外的拷贝构造或移动构造,因此它比push_back更快。由于它将构造函数参数传递给插入的对象,因此不允许传递到插入的对象的const引用。
args允许右值引用。
可以使用emplace_back来替换push_back,从而减少不必要的构造和析构开销。
如果要插入的元素需要复制操作,最好使用push_back,因为emplace_back并不能保证它会节省这些操作。
在使用emplace_back的时候,需要注意元素类型是否拥有默认或移动构造函数。
emplace_back允许我们直接在vector的末尾插入构造函数参数,避免了不必要的拷贝和构造开销,尤其是对于构造函数代价高昂的自定义类型。所以,在使用vector时可以优先考虑使用emplace_back。