21xrx.com
2024-12-28 08:16:56 Saturday
登录
文章检索 我的文章 写文章
C++中的push_back和emplace函数使用方法对比
2023-07-04 13:24:18 深夜i     --     --
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函数会更加方便快捷。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复