假设程序以相同的方式运行多次。在每次运行中,同一组对象以相同的插入顺序插入到QHash中;然后迭代QHash中的对象。问题是在每次运行程序时是否会以相同的顺序迭代对象?
答案 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)
QHash是无序的,因此不能假定迭代器的序列是可预测的。如果需要按键排序,请使用QMap。