C ++ Emplace Back против Pu sh Back Vector - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь понять emplace_back против push_back в Vector C ++. Хотя весь процесс emplace_back и push_back заключается в добавлении данных в конце, из того, что я понимаю из emplace, нет создания временных возражений. Но когда я вижу журналы, оба поведения остаются одинаковыми, Нужна помощь в понимании emplace_back против push_back

#include <iostream>
#include <vector>

using namespace std;

struct Foo

{

  int myint ;

  Foo(int n) 
  {
    cout<<"constructor called "<<this<<endl;
    myint = n;
  }

  Foo(const Foo& rhs ) 
  {
    cout<<"copy constructor called "<<this<<endl;
    myint = rhs.myint;
  }

  void display() {
    cout<<"in Display Foo int = "<<myint<<endl;
  }

};


int main()
{

 cout<<"********emplace example start ********"<<endl;

  std::vector<Foo> v;

  //v.push_back(Foo(85));
  v.emplace_back(Foo(34));

  for(auto &it : v) 
  {
    it.display();
  }

  cout<<"********emplace example end ********"<<endl;

    return 0;
}

**o/p:** 
**with emplace_back**

********emplace example start ********
constructor called 0x7ffe5ae28c18
copy constructor called 0x55e02adff280
in Display Foo int = 34
********emplace example end ********

**with push_back**

********emplace example start ********
constructor called 0x7ffcb958eb68
copy constructor called 0x5611e5144280
in Display Foo int = 85
********emplace example end ********

1 Ответ

2 голосов
/ 01 марта 2020

emplace_back передает заданные ему аргументы конструктору типа элемента, чтобы создать его на месте. Это то, что позволяет использовать emplace_back без создания временного объекта.

Вы этим не пользуетесь. Вы все еще создаете временный файл в v.emplace_back(Foo(34)); с выражением Foo(34). Ссылка на этот временный объект Foo(34) затем передается конструктору (copy) Foo для создания элемента на месте, но временный объект уже создан вне вызова emplace_back.

Вместо этого передать только аргументы конструктору:

v.emplace_back(34);

, который передаст 34 конструктору Foo, чтобы создать его на месте без какой-либо временной копии.

...