2009-10-21 40 views
11

我儘量做到以下幾點:爲什麼foreach使用const引用進行迭代?

QList<QString> a; 
foreach(QString& s, a) 
{ 
    s += "s"; 
} 

它看起來像它應該是合法的,但我結束了一個錯誤,抱怨它cannot convert from 'const QString' to 'QString &'

爲什麼Qt foreach使用const引用進行迭代?

回答

2

我相信Qt的foreach在迭代之前需要獲取原始集合的臨時副本,因此將非const引用修改爲臨時副本沒有任何意義。

21

作爲對Qt Generic Containers Documentation解釋:

Qt的自動當它進入一個foreach循環接受容器的副本。如果您在迭代時修改容器,則不會影響循環。 (如果你不修改容器,複製仍然會發生,但是由於隱式共享複製容器非常快。)同樣,聲明該變量爲非const引用,以修改當前項目該列表也不起作用。

它會生成副本,因爲您可能想從列表中刪除項目或在循環時添加項目。缺點是你的用例不起作用。您將不得不遍歷整個列表:

for (QList<QString>::iterator i = a.begin(); i != a.end(); ++i) { 
    (*i) += "s"; 
} 

多一點打字,但不要太多。

+4

小小挑逗:我比較喜歡: (QList :: iterator i = a.begin(),end = a.end();我!=結束; ...) – cheez 2009-10-21 15:21:42

2

也許對於你的情況:

namespace bl = boost::lambda; 
std::for_each(a.begin(),a.end(),bl::_1 += "s"); 
+0

使用Boost Lambda總是好事 – blwy10 2009-10-22 11:31:10

5

,或者您可以使用

QList<QString> a; 
BOOST_FOREACH(QString& s, a) 
{ 
    s += "s"; 
} 
0

用C++ 11,QT現在鼓勵這個標準for語法而不是的Qt的foreach

QList<QString> a; 
for(auto& s : a) 
{ 
    s += "s"; 
} 
相關問題