【发布时间】:2023-04-07 05:20:01
【问题描述】:
我无法想象没有人问过这个问题,但我没有找到它。
multimap 的每个元素是否包含它的值和它的键?
multimap 的内部结构是不是更像这样:
map<key, vector<value>>
或者更像这样:
vector<pair<key, value>>
【问题讨论】:
标签: c++ dictionary key key-value multimap
我无法想象没有人问过这个问题,但我没有找到它。
multimap 的每个元素是否包含它的值和它的键?
multimap 的内部结构是不是更像这样:
map<key, vector<value>>
或者更像这样:
vector<pair<key, value>>
【问题讨论】:
标签: c++ dictionary key key-value multimap
每个元素都包含它的键和值。
您可以判断,因为迭代返回一个稳定的非分配引用 std::pair<Key const, Value>。
更重要的是,键可以比较相等但不同。多图允许您在该键中存储不属于排序的“额外数据”,然后您将其取回并与该值相关联。
将多重映射实现为std::map<Key, std::vector<Value>> 有时比使用std::multimap<Key,Value> 更好。尤其是每个键有多个值时,它会更节省内存,具有更好的局部性等。如果你想统一地迭代它可能会更棘手,但如果你想迭代由键聚集的东西,那就更容易了。
【讨论】:
struct Foo { std::string a; std::string b; bool operator<( Foo const& rhs) const { return a < rhs.a; } }; -- 这是一个有效的 Key 类型。它包含a 和b 中的“额外数据”,这不是排序的一部分。如果你insert( { Foo{"hello", "world"}, value );,迭代器将包含一个Foo const,它在b 中有"world"。这对于多图来说并不是那么重要(为什么不把它放在值中?),但我有时将它用于多集或集(但是,你也可以说“为什么不只使用地图?” )
less 比较密钥的所有字段?不。它是否在任何地方都说只有less 比较的字段才能保证在该对的key 部分中有效?不,那么问题是什么? multimap 必须将它们保持为两个单独的对象的事实来自上述两个事实。