【问题标题】:Inserting heavy objects into std::map将重物插入 std::map
【发布时间】:2020-07-06 07:45:51
【问题描述】:

此代码中的VeryHeavy(args...) 精确复制了多少次?

map.emplace(std::pair<VeryHeavyKey, VeryHeavy>(key, VeryHeavy(args...)));

或者,也许,使用std::make_pair 更好? 复制对象是否有任何标准化的保证?将重物插入 std::map 而不复制的正确方法是什么?

【问题讨论】:

  • shared_ptr 怎么样?
  • 我不明白,我应该在哪里使用shared_ptr
  • map.emplace(std::move(key), VeryHeavy(args...)); 似乎是一种改进。我希望该代码的副本为零。
  • 是什么让std::move(...)
  • 我假设您已经有很多 VeryHeavy 并且需要将它们放在地图中。我的建议是用 shared_ptr 替换 VeryHeave。取决于您“不想”复制的内容。我可能会以错误的方式解释您的问题。

标签: c++ performance containers stdmap c++-standard-library


【解决方案1】:

在不复制的情况下将重物插入 std::map 的正确方法是什么?

C++17 之前

map.emplace(std::piecewise_construct,
              std::forward_as_tuple(std::move(key)),
              std::forward_as_tuple(args...));

发布 C++17

map.try_emplace(std::move(key), args...);

如果 key 已经存在,则 C++17 变体通过不构造 VeryHeavy 对前者进行了改进。

【讨论】:

    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多