C++ 回放与推回向量
C++ Emplace Back vs Push Back Vector
我试图理解 Vector C++ 中的 emplace_back 与 push_back 。虽然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 ********
emplace_back
将提供给它的参数传递给元素类型的构造函数以就地构造它。这就是允许在不创建临时对象的情况下使用 emplace_back
的原因。
你没有利用它。您仍在使用表达式 Foo(34)
在 v.emplace_back(Foo(34));
中创建一个临时文件。然后将对此 Foo(34)
临时文件的引用传递给 Foo
的(复制)构造函数以就地创建元素,但临时文件已在 emplace_back
调用之外创建。
相反,仅将参数传递给构造函数:
v.emplace_back(34);
这会将 34
传递给 Foo
的构造函数以在没有任何临时副本的情况下就地构造它。
我试图理解 Vector C++ 中的 emplace_back 与 push_back 。虽然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 ********
emplace_back
将提供给它的参数传递给元素类型的构造函数以就地构造它。这就是允许在不创建临时对象的情况下使用 emplace_back
的原因。
你没有利用它。您仍在使用表达式 Foo(34)
在 v.emplace_back(Foo(34));
中创建一个临时文件。然后将对此 Foo(34)
临时文件的引用传递给 Foo
的(复制)构造函数以就地创建元素,但临时文件已在 emplace_back
调用之外创建。
相反,仅将参数传递给构造函数:
v.emplace_back(34);
这会将 34
传递给 Foo
的构造函数以在没有任何临时副本的情况下就地构造它。