【问题标题】:Does Each Element of a multimap Contain Both the Key and Value?多图的每个元素是否都包含键和值?
【发布时间】:2023-04-07 05:20:01
【问题描述】:

我无法想象没有人问过这个问题,但我没有找到它。

multimap 的每个元素是否包含它的值和它的键?

multimap 的内部结构是不是更像这样:

map<key, vector<value>>

或者更像这样:

vector<pair<key, value>>

【问题讨论】:

    标签: c++ dictionary key key-value multimap


    【解决方案1】:

    每个元素都包含它的键和值。

    您可以判断,因为迭代返回一个稳定的非分配引用 std::pair&lt;Key const, Value&gt;。

    更重要的是,键可以比较相等但不同。多图允许您在该键中存储不属于排序的“额外数据”,然后您将其取回并与该值相关联。

    将多重映射实现为std::map&lt;Key, std::vector&lt;Value&gt;&gt; 有时比使用std::multimap&lt;Key,Value&gt; 更好。尤其是每个键有多个值时,它会更节省内存,具有更好的局部性等。如果你想统一地迭代它可能会更棘手,但如果你想迭代由键聚集的东西,那就更容易了。

    【讨论】:

    • 您能否详细说明多地图允许存储“额外数据”的地方。
    • @Slava struct Foo { std::string a; std::string b; bool operator&lt;( Foo const&amp; rhs) const { return a &lt; rhs.a; } }; -- 这是一个有效的 Key 类型。它包含a 和b 中的“额外数据”,这不是排序的一部分。如果你insert( { Foo{"hello", "world"}, value );,迭代器将包含一个Foo const,它在b 中有"world"。这对于多图来说并不是那么重要(为什么不把它放在值中?),但我有时将它用于多集或集(但是,你也可以说“为什么不只使用地图?” )
    • 是的,我理解这意味着什么,这似乎是合理的,但我在 multimap 的文档中找不到这样的保证。例如,是什么阻止它使用现有密钥的副本,而不是在出于任何原因存在等效密钥时使用提供的密钥。
    • @Slava 容器的一般规则?您将 X 放入一个容器中,X 的(副本)在其中。关于 map 或 multimap 的任何内容都没有说明“只要 X 保持秩序,我们就可以更改您的 X 以复制它”。现在,对于map,许多操作实际上不会放入X,而是会修改X的一部分(例如,m [key] = value - 如果找到键,它不会放入键,它只会修改值)。但是这些也被指定了。但是,据我所知,这样的 API 不在 multimap 中,只有在 map 中。
    • @Slava 我仍然不清楚你想从 Yakk 那里得到什么。你真正的问题是什么?您是否认为需要容器的less 比较密钥的所有字段?不。它是否在任何地方都说只有less 比较的字段才能保证在该对的key 部分中有效?不,那么问题是什么? multimap 必须将它们保持为两个单独的对象的事实来自上述两个事实。
    猜你喜欢
    • 2017-04-24
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2019-04-27
    相关资源
    最近更新 更多