请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

编程杂谈——使用emplace_back取代push_back

[复制链接]
查看2266 | 回复1 | 2019-10-17 09:45:02 | 显示全部楼层 |阅读模式

近日在YouTube视频上看到关于vector中emplace_back与push_back区别的先容,深感本身在现代C++中照旧有不少遗漏的知识点,遂写了段代码,实验比力两者的差异。

示例代码

  1. <code>#include <iostream>
  2. #include <vector>
  3. #include <functional>
  4. #include <chrono>
  5. class Item
  6. {
  7. public:
  8. Item(std::string name, bool display = true):name(name), display(display)
  9. {
  10. if (display)
  11. std::cout << "Constructor: " << name << std::endl;
  12. }
  13. Item(const Item& item):name(item.name), display(item.display)
  14. {
  15. if (item.display)
  16. std::cout << "Copy Consturctor: " << item.name << std::endl;
  17. }
  18. private:
  19. std::string name;
  20. bool display;
  21. };
  22. void calculate(std::vector<Item>& v, int count, std::function<void()> const& f)
  23. {
  24. clock_t begin_time = clock();
  25. for (auto i = 0; i < count; i++)
  26. {
  27. f();
  28. }
  29. std::cout << float(clock() - begin_time) / CLOCKS_PER_SEC << std::endl;
  30. }
  31. int main()
  32. {
  33. std::vector<Item> v;
  34. v.reserve(2);
  35. v.push_back(Item("push_back"));
  36. v.emplace_back("emplace_back", true);
  37. v.clear();
  38. int count = 100000;
  39. v.reserve(count);
  40. calculate(v, count, [&]() { v.push_back(Item("push_back", false)); });
  41. v.clear();
  42. calculate(v, count, [&]() { v.emplace_back("emplace_back", false); });
  43. }</code>
复制代码

运行结果

  1. <code>Constructor: push_back
  2. Copy Consturctor: push_back
  3. Constructor: emplace_back
  4. 0.431
  5. 0.28</code>
复制代码

结论

  • emplace_back方法可以不调用拷贝构造函数,所以理论上它应该比push_back性能更好
  • 经过10W次量级的数据盘算,最闭幕果与预期一致
  • reserve方法必须要使用,可以镌汰分配内存时间,提升性能






来源:https://www.cnblogs.com/kenwoo/p/11689284.html
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则