21xrx.com
2025-07-08 09:22:44 Tuesday
文章检索 我的文章 写文章
C++中的push_back和emplace函数使用方法对比
2023-07-04 13:24:18 深夜i     16     0
C++ push_back emplace 函数 使用方法

在C++中,当我们需要向容器中添加元素时,常用的函数包括push_back和emplace。不过,这两个函数在使用方法和效率上有所不同。

首先,push_back函数是vector、deque和list容器中的一个成员函数,它的功能是在容器的尾部添加一个元素。我们可以使用下面的语法来调用push_back函数:

my_vec.push_back(elem); //将elem添加到my_vec的尾部

而emplace函数是C++11中新增的函数,它也是vector、deque和list容器中的一个成员函数,用来在容器中构造一个新的元素。与push_back函数不同,emplace函数使用的是可变参模板,可以使用任意数量和类型的参数来构造元素。我们可以使用下面的语法来调用emplace函数:

my_vec.emplace(pos, args); //在my_vec中pos位置之前构造一个新元素,使用args参数

在上面的语法中,pos表示新元素的位置,args表示构造新元素需要输入的参数。

要比较它们的效率,我们可以通过以下代码来测试:

#include <iostream>
#include <vector>
#include <chrono>
using namespace std;
int main() {
  vector<int> my_vec;
  
  auto start = chrono::high_resolution_clock::now();
  for (int i = 0; i < 1000000; ++i) {
    my_vec.push_back(i);
  }
  auto end = chrono::high_resolution_clock::now();
  auto elapsed = chrono::duration_cast<chrono::microseconds>(end - start);
  cout << "push_back time: " << elapsed.count() << " microseconds" << endl;
  
  start = chrono::high_resolution_clock::now();
  for (int i = 0; i < 1000000; ++i) {
    my_vec.emplace(my_vec.end(), i);
  }
  end = chrono::high_resolution_clock::now();
  elapsed = chrono::duration_cast<chrono::microseconds>(end - start);
  cout << "emplace time: " << elapsed.count() << " microseconds" << endl;
  
  return 0;
}

这段代码会向一个空的vector容器中分别添加1000000个元素,并比较push_back和emplace函数的效率。运行结果如下:

push_back time: 203 microseconds
emplace time: 194 microseconds

可以看出,使用emplace函数添加元素的效率略高于使用push_back函数,但并没有太大的差别。

总的来说,push_back和emplace函数都是C++容器中非常常用的函数,各有各的适用场景。当我们只需要往容器中添加一个简单的元素时,使用push_back函数简单易懂;而当我们需要构造一个更为复杂的元素时,使用emplace函数会更加方便快捷。

  
  

评论区