【问题标题】:Why can't std::map::insert take a key and a value rather than an std::pair?为什么 std::map::insert 不能采用键和值而不是 std::pair?
【发布时间】:2015-12-12 16:04:44
【问题描述】:

std::map 有成员函数

template <class P> pair<iterator,bool> insert (P&& val);

我们使用例如像这样:

my_map.insert(std::make_pair(k, v));

问题是,为什么没有insert() 的变体,它只需要一个键和一个值,即

pair<iterator,bool> insert (K&& key, V&& value);

(当然 K 和 V 是地图的模板参数)我们将使用例如像这样:

my_map.insert(k, v);

在我看来这是完全合理的。

【问题讨论】:

    标签: c++ c++11 interface stl containers


    【解决方案1】:

    这是在 C++11 中添加的,所有容器的 emplace 成员,map 具有签名

    template< class... Args >
    std::pair<iterator,bool> emplace( Args&&... args );
    

    【讨论】:

    • emplace 和 insert 是两件不同的事情——其中一个获取值,另一个获取构造函数参数。你能解释一下你如何相信emplace() 与我建议的insert() 变体相同吗?
    • @einpoklum N4567 的标准容器要求汇总表 102 声明 emplace 将其参数转发给容器 value_type 的构造函数。对于std::map,这意味着emplace(k,v) 将插入一个std::pair&lt;const K, V&gt;
    【解决方案2】:

    如果您正在寻找更明显的语法,您可以使用键和值作为单独的实体执行相同的插入,如下所示:

    my_map[k] = v;
    

    当然,这是两个独立的操作。一个插入后跟一个赋值,因此它可能不如单个插入有效。但是话又说回来,地图将它们的条目存储成对,因此对insert(k, v)函数的调用可能最终会创建一个pair&lt;k, v&gt;

    【讨论】:

    • 谢谢,但是 - 这不是我要问的。我知道operator[] - 我也知道has its problems
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2015-03-04
    相关资源
    最近更新 更多