Skip to content

Latest commit

 

History

History
32 lines (23 loc) · 996 Bytes

File metadata and controls

32 lines (23 loc) · 996 Bytes

条款42:考虑置入而非插入

从原理上说,置入函数应该有时比对应的插入函数高效,而且不应该有更低效的可能。

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*);