【问题标题】:C++ - insert into std::map directly without assignment operatorC++ - 直接插入 std::map 而不使用赋值运算符
【发布时间】:2015-02-19 03:41:34
【问题描述】:

我有一个std::map,我想在其中插入一个对象,但我想避免不必要的复制,因为它是一个大对象,并且复制需要时间。 我试过这个:

MyPODType data(otherData);
data.modify();
myMap["Some key"] = data;

但是,这需要 2 个副本:一个用于复制 otherData,另一个在赋值运算符中用于插入对象。由于是POD,所以拷贝构造函数和赋值运算符都是默认的。

我怎样才能只用 1 个副本做到这一点?我意识到一些编译器会优化第二个副本,但我想以一种可移植的方式来做到这一点。

【问题讨论】:

  • myMap.emplace("Some key", otherData).first->second.modify();
  • 谢谢! emplace 看起来正是我需要的。

标签: c++ c++11 copy-constructor assignment-operator stdmap


【解决方案1】:

(我假设MyPODType 是您的map 的确切value_type

正如 Igor Tandetnik 在 cmets 中指出的那样,从 C++11 开始,您可以编写:

myMap.emplace("Some key", otherData);

然后您可以在地图中的值上调用modify()

emplace 函数将使用 完美转发 将您的参数分别转发给键和值的构造函数,而不必创建一个临时的 std::pair 或默认构造一个值。

也可以使用insert:

std::pair<KeyType, MyPODType> p = { "Some key ", otherData };
p.second.modify();
myMap.insert( std::move(p) );

虽然emplace 选项看起来更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多