从原理上说,置入函数应该有时比对应的插入函数高效,而且不应该有更低效的可能。
std::vector<std::string> vs;
vs.push_back("xyz"); // error!
vs.push_back(std::string("xyz")); // 多次构造,性能损失
vs.emplace_back("xyz"); // 直接将参数完美转发给构造函数,
// 在容器内构造对象从实践上来说,置入函数在以下几个前提成立时,极有可能会运行得更快:
- 待添加的值是以构造而非赋值方式加入容器
- 传递的实参类型与容器元素类型不同
- 容器不会由于存储重复值而拒绝待添加的值
置入函数可能会执行在插入函数中被拒绝的类型转换。
std::vector<std::regex> regexes;
regexes.emplace_back(nullptr); // ok
regexes.push_back(nullptr); // error!因为存在这样的构造函数,禁止复制初始化:
explicit regex(const char*);