为什么 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));
}
为什么 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));
}