2010-07-22 85 views
1

假设程序以相同的方式运行多次。在每次运行中,相同的一组对象以相同的插入顺序插入到QHash中;那么QHash中的对象将被迭代。问题是这些对象是否会在程序的每次运行中以相同的顺序迭代?Qt的QHash迭代顺序是否可以在程序的多个相同运行之间重复?

+0

如果更改Qt版本会怎么样?那么你将不得不重新测试你的假设,因为你依赖的是没有记录的行为。 – RedX 2012-07-20 15:45:36

回答

3

也许,但你不能绝对依靠它。

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

但是,没有什么能够阻止某人创建一个类型,输出qHash依赖于某个值(例如对象中保存的指针地址),该值对于特定的运行将是常量,但在运行之间不一致。

0

如果使用的qHash重载保证在程序运行中返回相同的qHash值,那么QHash迭代顺序是否保证在不同的运行中保持相同?除了依赖qHash返回值,QHash是如何实现的(除了依赖qHash返回值)还有其他什么可能导致QHash迭代次序在完全相同的一组对象(按相同顺序插入)上跨程序运行发生变化?

+0

这应该是作为我的答案评论,而不是答案本身。但是,回应是Qt文档调用'QHash'“无序”,所以没有接口保证即使插入顺序和“qHash”值相同,迭代顺序也是一样的。也就是说,如果你检查源代码,你会发现它将是相同的,并且可能会保持这种方式,因为它实际上需要刻意的努力使它不能以这种方式工作。所以,答案是“实际上是的,理论上没有”。 – 2010-07-22 19:28:57

0

引述the documentation

QHash是无序的,所以迭代器的序列不能被认为是可预测的。如果需要按键排序,请使用QMap。

相关问题