Qt的QHash的迭代顺序是否可以在程序的多个相同运行中重复?

时间:2010-07-22 02:15:35

标签: c++ qt iteration

假设程序以相同的方式运行多次。在每次运行中,同一组对象以相同的插入顺序插入到QHash中;然后迭代QHash中的对象。问题是在每次运行程序时是否会以相同的顺序迭代对象?

4 个答案:

答案 0 :(得分:3)

可能,但你不能完全依赖它。

QHash这样的

QSet要求用作键的任何类型都会提供将对象转换为哈希码的qHash函数的重载。在哈希内部,项目按哈希码排序。通常,这种转换为哈希代码的方式是稳定且确定的,因此对象将接收相同的哈希码,因此即使在运行之间也会以相同的顺序进行。

然而,没有什么可以阻止某人创建一个类型,其中输出qHash依赖于某个值(例如,在对象中保存的指针地址),这对于特定的运行是恒定的,但是在运行之间不一致

答案 1 :(得分:1)

老问题,但我可以得到这个代码

QSet<QPair<int, int>> set;
set.insert(qMakePair(1, 2));
set.insert(qMakePair(3, 4));
for (QSet<QPair<int, int>>::const_iterator it = set.constBegin(); it != set.constEnd(); ++it)
{
    std::cout << it->first << ' ' << it->second << std::endl;
}

打印

1 2
3 4

3 4
1 2

在同一 Qt 版本上的后续运行。所以看起来原始问题的答案是否定的。但是有人可以解释为什么吗?是不是因为每次运行时向 qhash 传递了不同的种子值?

答案 2 :(得分:0)

如果使用的qHash重载保证在程序运行中返回相同的qHash值,那么QHash迭代顺序是否保证在运行中相同?关于如何实现QHash(除了依赖qHash返回值)还有什么可能导致QHash迭代顺序在完全相同的对象集(程序以相同顺序插入)的程序运行中变化吗?

答案 3 :(得分:0)

引用the documentation

  

QHash是无序的,因此不能假定迭代器的序列是可预测的。如果需要按键排序,请使用QMap。