Malov Vladimir Asked:2020-09-25 06:19:48 +0000 UTC2020-09-25 06:19:48 +0000 UTC 2020-09-25 06:19:48 +0000 UTC push_back 和 emplace_back 的区别 772 vector::push_back()告诉我,旧标准和新标准有什么区别vector::emplace_back()? c++ 3 个回答 Voted Harry 2020-09-25T12:54:22Z2020-09-25T12:54:22Z 更像是一个例子...... struct Item { int a, b, c; Item(int a,int b,int c):a(a),b(b),c(c){} }; int main(int argc, const char * argv[]) { vector<Item> x; // x.push_back(1,2,3); <- не скомпилируется! x.emplace_back(1,2,3); } 如您所见,push_back'y 需要一个元素类型对象(或可转换对象)。但是'y 只是像构造emplace函数一样传递参数。 PS 很明显这个构造函数也可以是拷贝构造函数:) 所以 x.emplace_back(Item(0,1,2)); 也有效。 Best Answer αλεχολυτ 2020-09-25T06:27:19Z2020-09-25T06:27:19Z push_back添加对象的副本(或者如果可能的话提供移动),但emplace_back直接在向量的末尾创建对象,即 没有不必要的复制(或移动)。 Traveller 2020-01-23T22:49:39Z2020-01-23T22:49:39Z x.push_back({ 1,2,3 }); // Работает 我会说 push_back 更通用。使用 emplace_back,在更复杂的算法中存在细微差别。例如,将多维向量的元素复制到一维向量时。看起来是可以的,但是编译的时候就卡死了。我会说它们是相辅相成的。如果 emplace_back 有效,则保留它,如果出现奇怪的错误,则设置 push_back 并添加 {},如上所示。
更像是一个例子......
如您所见,
push_back'y 需要一个元素类型对象(或可转换对象)。但是'y 只是像构造emplace函数一样传递参数。PS 很明显这个构造函数也可以是拷贝构造函数:) 所以
也有效。
push_back添加对象的副本(或者如果可能的话提供移动),但emplace_back直接在向量的末尾创建对象,即 没有不必要的复制(或移动)。x.push_back({ 1,2,3 }); // Работает我会说 push_back 更通用。使用 emplace_back,在更复杂的算法中存在细微差别。例如,将多维向量的元素复制到一维向量时。看起来是可以的,但是编译的时候就卡死了。我会说它们是相辅相成的。如果 emplace_back 有效,则保留它,如果出现奇怪的错误,则设置 push_back 并添加 {},如上所示。