why we use emplace_back()? When should we use emplace_back()?
Let’s first define our class 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class  Base  {public :    Base (int  id, const  string& name) : m_id (id), m_name (name) {         cout << "Base(int, string&)\n" ;     }          Base (const  Base& obj): m_id (obj.m_id), m_name (obj.m_name) {         cout << "Base(const Base&)\n" ;     }          Base (Base&& obj) : m_id (obj.m_id), m_name (move (obj.m_name)) {         cout << "Base(Base&&)\n" ;     }          ~Base () {         cout << "~Base()\n" ;     } private :    int  m_id;     string m_name; }; 
Let’s take a look at example 1 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int  main ()      Base b1 (0 , "Joe" )  ;          cout << "---------push_back()\n" ;     vector<Base> vec1;     vec1.push_back (b1);           cout << "---------emplace_back()\n" ;     vector<Base> vec2;     vec2.emplace_back (b1);           cout << "---------finish\n" ;          return  0 ; } 
example 2 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int  main ()      Base b1 (0 , "Joe" )  ;     Base b2 (0 , "Jack" )  ;          cout << "---------push_back()\n" ;     vector<Base> vec1;     vec1.push_back (move (b1));           cout << "---------emplace_back()\n" ;     vector<Base> vec2;     vec2.emplace_back (move (b2));           cout << "---------finish\n" ;          return  0 ; } 
example 3 
1 2 3 4 5 6 7 8 9 10 11 12 13 int  main ()      cout << "---------push_back()\n" ;     vector<Base> vec1;     vec1.push_back (Base (0 , "Joe" ));           cout << "---------emplace_back()\n" ;     vector<Base> vec2;     vec2.emplace_back (Base (1 , "Jack" ));           cout << "---------finish\n" ;          return  0 ; } 
Explain: Base(0, “Joe”) creates a temporary class instance. After it is being used, it get deleted.
example 5 
1 2 3 4 5 6 7 8 9 10 11 12 13 int  main ()      cout << "---------push_back()\n" ;     vector<Base> vec1;     vec1.push_back (Base (0 , "Joe" ));           cout << "---------emplace_back()\n" ;     vector<Base> vec2;     vec2.emplace_back (1 , "Jack" );           cout << "---------finish\n" ;          return  0 ; } 
Conclusion