使用 foreach 循环遍历嵌套的 QHash
Posted
技术标签:
【中文标题】使用 foreach 循环遍历嵌套的 QHash【英文标题】:loop through nested QHash with foreach 【发布时间】:2013-07-08 10:00:55 【问题描述】:我有QHash<QString, QHash<quint64, QElapsedTimer*> myNestedQHash;
,当我尝试时
foreach (QHash<quint64, QElapsedTimer*> stat, myNestedQHash.values(someStr))
我明白了
error: macro "Q_FOREACH" passed 3 arguments, but takes just 2
难道不能像我一样循环嵌套 QHash 吗?
【问题讨论】:
这是 stat 的 QHashtypedef QHash<quint64, QElapsedTimer*> statType
那么它应该可以工作,但我想知道为什么这不起作用...
【参考方案1】:
为什么不使用
for (QHash<QString, QHash<quint64, QElapsedTimer*>::iterator it = myNestedQHash.begin(); it != myNestedQHash.end(); ++it)
...
相反?我认为Q_FOREACH
会创建一个副本,所以性能也会更好...
/编辑:
foreach 只是 Q_FOREACH 宏的定义......所以编译器看到它并接受 2 个值。因为你有一个额外的逗号,它会看到 3 个参数。您将找到所有信息here。
【讨论】:
你是对的,我做了同样的循环遍历我的嵌套 QHash,但我想知道为什么我不能使用 foreach,我的意思是那里有什么问题,而不是如何在嵌套的 QHash 上循环。foreach
只是Q_FOREACH
宏的定义......所以编译器会看到它并接受 2 个值。因为你有一个额外的逗号,它会看到 3 个参数。你会在这里找到所有信息:marcmutz.wordpress.com/effective-qt/containers ;)
干杯,将您的评论作为编辑在您的答案中,我会接受它。
Qt 容器副本是轻量级的写时复制对象,因此对性能的影响可以忽略不计。【参考方案2】:
应该像这样工作:
QHash<QString, int> myHash0;
myHash0["test0"]=0;
myHash0["test1"]=1;
QHash<QString, int> myHash1;
myHash1["test0"]=0;
myHash1["test1"]=1;
QHash<QString, QHash<QString, int> > myHashList;
myHashList["Hash0"] = myHash0;
myHashList["Hash1"] = myHash1;
QHash<QString, int> h;
foreach(h , myHashList)
qDebug()<<h["test0"];
【讨论】:
我现在有点用 QString/int... 懒惰的打字机 :) 但只要你把QHash<quint64, QElapsedTimer*> stat
从 foreach 宏中拿走,它就应该可以工作了【参考方案3】:
QT foreach
是一个宏。并且宏中的参数用逗号分隔,
在你的情况下,你使用一个带有逗号的模板。
你可以写成:
QHash<quint64, QElapsedTimer*> stat;
foreach (stat, myNestedQHash.values(someStr))
【讨论】:
以上是关于使用 foreach 循环遍历嵌套的 QHash的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Nightwatch 测试的自定义命令中添加嵌套函数 javascript - forEach - 循环遍历元素