为什么std :: map没有insert类型的插入函数(key& k,val& v)

时间:2016-05-23 21:02:12

标签: c++ c++11 std c++-standard-library

为什么std::map不支持以下插入内容:

std::map<obj1, obj2> map_int;

void insert_map(obj1 &key, obj2 &val)
{
    map_int.insert(key, val);
}

我知道上述内容不正确。我想知道是什么阻止了这样设计插入函数。它比创建一对IMO更直观。

3 个答案:

答案 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));
}