为什么std::map
不支持以下插入内容:
std::map<obj1, obj2> map_int;
void insert_map(obj1 &key, obj2 &val)
{
map_int.insert(key, val);
}
我知道上述内容不正确。我想知道是什么阻止了这样设计插入函数。它比创建一对IMO更直观。
答案 0 :(得分:8)
它被称为emplace()
:
std::map<std::string, std::string> m; // uses pair's template constructor m.emplace("d", "ddd");
答案 1 :(得分:2)
在C ++ 17中,您可以使用:
map_int.try_emplace(key, val);
这实际上会返回一些有用的信息:
std::pair<std::map<obj1, obj2>::iterator, bool> p = map_int.try_emplace(key, val);
p.first
是一个迭代器,它指向具有给定键的元素。p.second
表示是否发生了插入。您可以使用map_int.emplace(key, val)
在C ++ 11中实现类似的效果,但存在一些细微的差异(与复制/移动值有关)。此外,try_emplace
允许方便地构造任意元素:
struct X { X(int, char, bool); };
std::map<int, X> m;
m.try_emplace(10, 20, 'x', false); // constructs X(20, 'x', false) if new
C ++ 11中的类似操作如下所示:
m.emplace(
std::piecewise_construct,
std::forward_as_tuple(10),
std::forward_as_tuple(20, 'x', false));
答案 2 :(得分:0)
std::map
确实拥有insert()
方法(实际上有几个),它只是具有与您期望的不同的签名。您需要传递一个包含所需键和值的std::pair
,例如:
std::map<obj1, obj2> map_int;
void insert_map(obj1 &key, obj2 &val)
{
map_int.insert(std::make_pair(key, val));
}