本人最近看别人代码的时候,发现别人用到了emplace_back(),通过搜索和测试,在这里记录一下他们的区别。
1、相同的情况
以变量的方式从尾部插入时,这两种用法完全一样,没有区别。以vector test为例,See可以为任意类型
struct See
{
int value;
};
int main()
{
vector<See> test;
See a;
a.value = 2;
test.push_back(a); //以变量的方式从尾部插入
test.emplace_back(a); //以变量的方式从尾部插入
for (int i = 0; i < test.size(); i++)
{
cout << "Vector[" << i << "]" << test.at(i).value << endl;
}
return 0;
}
2、不同的情况
同样以vector test为例,根据vector中存放的不同类型,push_back()可以识别元素类型;emplace_back()需要显式标注出是何种类型,具体见下述代码
int main()
{
vector<int> test;
test.push_back(2); //OK
test.emplace_back(3); //OK
for (int i = 0; i < test.size(); i++)
{
cout << "Vector[" << i << "]" << test.at(i) << endl;
}
return 0;
}
vector<string> test;
test.push_back("ss"); //OK
test.emplace_back("ss"); //OK
test.push_back({"ss"}); //OK
test.emplace_back({"ss"}); //Error
test.emplace_back(string{"ss"}); //OK
有上例可以举一反三的应用到bool,int,以及自定义的类型。
综上,在插入变量的时候两者在用法上没有区别,在插入值的时候,push_back()更简单一些,emplace_back()则需要显式标注出类型。