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

Why does std::map not have an insert function of type insert(key &k, val &v)

为什么 std::map 不支持如下插入:

std::map<obj1, obj2> map_int;

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

我知道以上是不正确的。我想知道是什么阻止了这样设计插入功能。它比创建一对 IMO 更直观。

叫做emplace():

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

// uses pair's template constructor
m.emplace("d", "ddd");

在C++17中,你可以使用:

map_int.try_emplace(key, val);

这实际上returns一些有用的信息:

std::pair<std::map<obj1, obj2>::iterator, bool> p = map_int.try_emplace(key, val);
  • p.first 是指向具有给定键的元素的迭代器。
  • p.second表示插入是否发生。

您可以在 C++11 中使用 map_int.emplace(key, val) 实现类似的效果,但存在一些细微差别(与值的 copying/moving 相关)。此外,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));

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