如何在std :: map中创建新条目而不复制条目值 - 没有指针

时间:2015-12-01 13:50:35

标签: c++ c++11 std stdmap

我有一张地图:

std::map<std::string, MyDataContainer>

MyDataContainer有些classstruct(无所谓)。现在我想创建一个新的数据容器。让我们说我想用默认的构造函数来实现它:

// This is valid, MyDataContainer doesn't need constructor arguments
MyDataConstructor example;
// The map definition
std::map<std::string, MyDataContainer> map;
std::string name("entry");
// This copies value of `example`
map[name] = example;
// Below, I want to create entry without copy:
std::string name2 = "nocopy"
// This is pseudo-syntax
map.createEmptyEntry(name2);

有办法吗?当我想在地图中初始化它时跳过创建辅助变量?是否可以使用构造函数参数来完成它?

我认为这个问题也适用于其他标准容器,例如

2 个答案:

答案 0 :(得分:7)

使用emplace

#include <map>
#include <string>
#include <tuple>

std::map<std::string, X> m;

m.emplace(std::piecewise_construct,
          std::forward_as_tuple("nocopy"),
          std::forward_as_tuple());

这概括为新键值和映射值的任意consructor参数,您只需将其放入相应的forward_as_tuple调用中。

在C ++ 17中,这有点容易:

m.try_emplace("nocopy"  /* mapped-value args here */);

答案 1 :(得分:2)

您可以使用map::emplace:请参阅documentation

m.emplace(std::piecewise_construct,
          std::forward_as_tuple(42), // argument of key constructor
          std::forward_as_tuple());  // argument of value constructor