不可以的,这是由QMap底层结构决定的。
The QMap class is a template class that provides a red-black-tree-based dictionary.
上面是从Qt帮助手册摘录的QMap说明,可以看到QMap是基于红黑树实现的。
那么你插入的节点是要被排序的,就不可能保证插入顺序了;如果要保证顺序,只能使用数组、链表这类结构。
还有一种比较复杂的方法,就是根据你具体的业务,设计一个符合结构。
比如,你的业务中插入、查询和修改较多,删除操作较少,可以把Value和Key分别放在两个容器里面,每次插入数据的时候,引入一个当前的序列号Number:
QHash<Key, Number> keyHash;
QMap<Number, Value> valueMap;
这样valueMap可以保证按照插入顺序浏览,查询的时候通过keyHash找到key->Number,然后使用Number在valueMap中找到对应的值。
这样做的好处是,当列表比较大的时候,查询效率会比直接使用数组和链表更高;
坏处是耗费2倍的资源,并且插入和删除需要对两个容器操作和同步,维护效率更低。
虽然我不写QT,但是我知道这玩意儿要用链表实现…如果QT中没有的话,你可以用一个List配合QMap实现。
大概思路:QMap的key是你本来的key,value则是List中值的索引。插入就是如果QMap中不存在key,就append到List的后面并记录下值的索引…当然这个实现的时间复杂度有点问题。正统写法参考Java中的LinkedHashMap。