Qt C++ 如何将哈希的副本复制到地图

Qt C++ How to preform copy of an Hash to a Map

本文关键字:副本 复制 地图 哈希 C++ Qt      更新时间:2023-10-16

我正在Qt中尝试一些东西并试图理解容器,但我遇到了一堵砖墙。

QHash<int, QString> mHash;
mHash.insert(3, "Nocas");
mHash.insert(1, "Andre");
mHash.insert(2, "Diana"); //overrides
mHash.insertMulti(5, "Batatas"); //overides all keys '5'
qDebug() << "nHash.keys()n";
foreach(int i, mHash.keys())
{
qDebug() << i << " -> " << mHash[i];
}
qDebug() << "nHash Valuesn";
foreach(QString value, mHash)
{
qDebug() << "Value: " << value;
}
qDebug() << "nPre Copyn";
QHashIterator<int, QString> Hit(mHash);
while (Hit.hasNext())
{
Hit.next();
qDebug() << Hit.key() << " = " << Hit.value();
}
QMap<int, QString> HMap;
QMutableMapIterator<int, QString> it2h(HMap);
//Copy Hash to Map
while (Hit.hasNext())
{
Hit.next();
HMap.insert(Hit.key(), Hit.value());
}
qDebug() << "Print map: n";
while (it2h.hasNext())
{
it2h.next();
qDebug() << it2h.key() << " = " << it2h.value();
}

我不明白为什么这样:

while (Hit.hasNext())
{
Hit.next();
HMap.insert(Hit.key(), Hit.value());
}

不行。

我看过文献,但我并不真正理解它。 我尝试更改迭代器。

QMap<int, int>::const_iterator i;

使用foreach,用于...仍然没有任何东西永远不会输出。

输出为:

Hash.keys()
5  ->  "Batatas"
1  ->  "Andre"
3  ->  "Nocas"
2  ->  "Diana"
Hash Values
Value:  "Batatas"
Value:  "Andre"
Value:  "Nocas"
Value:  "Diana"
Pre Copy
5  =  "Batatas"
1  =  "Andre"
3  =  "Nocas"
2  =  "Diana"
Print map:

正如您在"打印地图:"之后看到的那样,我期待这些值。

QHashIterator<int, QString> Hit(mHash);
while (Hit.hasNext())
{
Hit.next();
qDebug() << Hit.key() << " = " << Hit.value();
}

此代码创建哈希映射的迭代器并遍历它,以便falsehasNext函数。正如输出所证明的那样,这工作正常。

QMap<int, QString> HMap;
QMutableMapIterator<int, QString> it2h(HMap);
//Copy Hash to Map
while (Hit.hasNext())
{
Hit.next();
HMap.insert(Hit.key(), Hit.value());
}

接下来,代码尝试再次循环访问Hit,但它已经在末尾并且不执行任何循环。这应该是可以通过使用调试器单步执行或将 print 语句添加到 for 循环来验证的。

由于上述循环不执行,因此不会复制任何内容,因此QMap没有任何值。需要重置Hit迭代器或创建一个新迭代器,以便在尝试迭代以进行复制之前指向哈希映射的开头。


看起来有一个toFrontAPI 可以将迭代器重置回前面,以便迭代可以再次开始,请参阅 https://doc.qt.io/qt-5/qhashiterator.html#toFront。我无权访问 QT 来测试和验证它的行为,因为我反对。

由于詹姆斯·阿德基森(James Adkison(的回答,我通过使用hasPrevious((解决了它,因为他说指针将指向末尾。

QMap<int, QString> HMap; //I created the map
while (Hit.hasPrevious()) //used hasPrevious() to work my way back to the start
{
Hit.previous(); //pointed to previous on every loop
HMap.insert(Hit.key(), Hit.value()); //inserted on map
}
QMutableMapIterator<int, QString> itM(HMap);
qDebug() << "nPost Copyn";
while (itM.hasNext())
{
itM.next();
qDebug() << itM.key() << " = " << itM.value();
}

由于我的目标是使用地图来组织按键,因此它就像一个魅力。

这是我使用的最终解决方案:

Hit.toFront();
while (Hit.hasNext())
{
Hit.next();
HMap.insert(Hit.key(), Hit.value());
}