使用 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 的 QHash 类型定义的问题。试着把它放在括号里,我记得有同样的问题,但我只是不记得我解决了这个问题。 如果我 typedef QHash&lt;quint64, QElapsedTimer*&gt; 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&lt;quint64, QElapsedTimer*&gt; stat 从 foreach 宏中拿走,它就应该可以工作了【参考方案3】:

QT foreach 是一个宏。并且宏中的参数用逗号分隔,

在你的情况下,你使用一个带有逗号的模板。

你可以写成:

QHash<quint64, QElapsedTimer*>  stat;  
foreach (stat, myNestedQHash.values(someStr))

【讨论】:

以上是关于使用 foreach 循环遍历嵌套的 QHash的主要内容,如果未能解决你的问题,请参考以下文章

php foreach 嵌套循环大数组很慢?

嵌套循环遍历算法分析比较

如何在 Nightwatch 测试的自定义命令中添加嵌套函数 javascript - forEach - 循环遍历元素

bboss oreach循环嵌套遍历map

循环遍历 Laravel Blade 模板中的嵌套数组

急! jquery $.each 嵌套循环遍历