我想看一下push_back和emplace_back之间的区别,因为在很多地方我读到了推荐使用emplace_back的建议,因为“它可以做所有push_back能做的事情,而且更多”,所以我期望它更高效。但令我惊讶的是
emplace_back调用移动构造函数,然后在push_back调用一个移动构造函数时复制一个。我已经使用g++(Ubuntu 7.4.0-1ubuntu1~16.04~ppa1)7.4.0和在线C++ shell进行了检查。 我有什么遗漏吗?
#include <iostream>
#include <vector>
class A
{
public:
A() { std::cout << "A const\n"; }
~A() { std::cout << "A dest\n"; }
A(const A& a) { std::cout << "A copy const\n"; }
A(A&& a) { std::cout << "A move const\n"; }
A& operator=(const A& a) { std::cout << "A copy operator=\n"; return *this; }
A& operator=(A&& a) { std::cout << "A move operator=\n"; return *this; }
};
int main () {
std::vector<A> va;
std::cout << "push:\n" << std::endl;
va.push_back(A());
std::cout << "\nemplace:\n";
va.emplace_back(A());
std::cout << "\nend:\n";
return 0;
}
输出是
push:
A const
A move const
A dest
emplace:
A const
A move const
A copy const
A dest
A dest
end:
A dest
A dest
emplace_back调用移动构造函数,然后在push_back调用一个移动构造函数时复制一个。我已经使用g++(Ubuntu 7.4.0-1ubuntu1~16.04~ppa1)7.4.0和在线C++ shell进行了检查。 我有什么遗漏吗?
emplace_back
并比较结果。 - HolyBlackCatemplace_back()
- 注意没有参数。 - StoryTeller - Unslander Monicava.emplace_back();
即可,无需构造一个完全无用的临时对象来移动构造向量中的值。 - Sam Varshavchik