Qt C++ 如何将哈希的副本复制到地图
Qt C++ How to preform copy of an Hash to a Map
我正在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();
}
此代码创建哈希映射的迭代器并遍历它,以便false
hasNext
函数。正如输出所证明的那样,这工作正常。
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
迭代器或创建一个新迭代器,以便在尝试迭代以进行复制之前指向哈希映射的开头。
看起来有一个toFront
API 可以将迭代器重置回前面,以便迭代可以再次开始,请参阅 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());
}
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 为什么 std::string s = "123" 当不涉及副本时被视为复制初始化?
- 如何避免将数据缓冲区的额外副本复制到字符串?
- Qt C++ 如何将哈希的副本复制到地图
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 复制构造函数生成旧数组的错误副本
- 复制构造函数和运算符"="他们没有打印列表 l 的副本
- 复制指针,在不更改原始指针的情况下更改副本指向的内容?
- 在派生类之间复制共享变量(浅副本就足够了)
- 从GPU到CPU的副本比将CPU复制到GPU慢
- 复制构造函数不起作用,无法修改副本
- 使用函数中的复制构造函数创建实例的副本,该函数获取作为基对象传递的实例
- 无法访问类 sf::不可复制中的私有成员.副本在哪里?C++
- 如何复制文件,但触摸新副本上的时间戳
- 是否可以使用数组副本复制矢量的一部分
- 如果引发的异常始终是异常对象的副本,为什么不调用此复制构造函数?
- 复制/修改STL容器的副本是线程安全的
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员
- 父级指针的副本,而不在子项中复制副本