QMap 和 QMultiMap 中的项目顺序

Posted

技术标签:

【中文标题】QMap 和 QMultiMap 中的项目顺序【英文标题】:Order of items in QMap and QMultiMap 【发布时间】:2014-11-23 09:44:25 【问题描述】:

我想使用QMultiMap(派生自QMap)来存储键/值对。因为我可以多次使用密钥,所以我更喜欢使用QMultiMap

假设我将按给定顺序插入以下对:

"C" -> 5
"A" -> 10
"B" -> 77
"B" -> 1
"X" -> 314159

在遍历地图时(最好使用 java 风格的迭代器),我需要保留等键对的顺序。 IE。 "B" -> 77"B" -> 1 在迭代时应该完全按照插入顺序出现。不同的键之间的顺序无关紧要。

不幸的是,文档没有说明该细节。它说

使用 QMap,项目总是按键排序

但它没有说明是否/如何对相等的键进行排序。

QMap 是否保留了具有相同键的对的插入顺序,还是可以以某种方式保留?

【问题讨论】:

【参考方案1】:

来自关于 QMap::iterator 的 Qt 文档:

与以任意顺序存储项目的 QHash 不同,QMap 存储按键排序的项目。共享相同密钥的项目 (因为它们是使用 QMap::insertMulti() 插入的,或者由于 unity()) 将连续出现,从最近到 最近最少插入的值。

因此,QMap 似乎保持了具有相同键的对的反向插入顺序。

【讨论】:

这就是我要寻找的。谢谢。这意味着我的问题的解决方案应该是以相反的顺序遍历地图。【参考方案2】:

有一个重载QMap::insertMulti(const_iterator pos, const Key &key, const T &value),其中pos 是一个“提示”,您可以传递constBegin()constEnd(),或者在要进行插入的集合中间的某个迭代器。这是在您有重复键时指定顺序的方法。

我认为人们通常可以看到保留的订单就像是一个堆栈一样,这可能是幸运的......

【讨论】:

以上是关于QMap 和 QMultiMap 中的项目顺序的主要内容,如果未能解决你的问题,请参考以下文章

Qt532.容器QMap&QMultiMap

QMap 与 QHash

Qt ------- QMap和QHash的区别

qt qmultimap 哪种遍历器 效率好

使用 QMap 是不是可能有害?

以人类可读的形式在 QSettings 中保存自定义 QMap 模板实例化