为什么foreach使用const引用进行迭代?

时间:2009-10-21 13:44:18

标签: c++ qt foreach

我尝试执行以下操作:

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

看起来它应该是合法的,但我最后抱怨它是cannot convert from 'const QString' to 'QString &'

为什么Qt foreach用const引用迭代?

5 个答案:

答案 0 :(得分:21)

正如Qt Generic Containers Documentation

所述
  

Qt在进入foreach循环时会自动获取容器的副本。如果在迭代时修改容器,则不会影响循环。 (如果不修改容器,副本仍然会发生,但由于隐式共享复制容器非常快。)同样,声明变量是非const引用,以便修改当前项目该列表也不起作用。

它会制作副本,因为您可能希望从列表中删除项目或在循环时添加项目。缺点是你的用例不起作用。您将不得不迭代列表:

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

多点打字,但不要太多。

答案 1 :(得分:5)

或者您可以使用

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

答案 2 :(得分:2)

我相信Qt的foreach在迭代它之前会获取原始集合的临时副本,因此将非const引用修改为临时副本没有任何意义,它将无效。

答案 3 :(得分:2)

也许是你的情况:

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

答案 4 :(得分:1)

使用C ++ 11,Qt现在鼓励使用此标准for语法而不是 Qt foreach

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