2017-09-19 19 views
0

私はintのQListを持っています。QList <int>値の置換

eg: [10,10]; 

その後、私は1

で値を減らしたい私が試した:

foreach (int val, valList) { 
    val-= 1; 
} 

しかしvalListのqDebugは10です。私は間違って何をしましたとして、それらの値が残って示して?あなたがthe official documentationとして反復処理された容器内の値を変更するためのforeachを使用することはできません

答えて

2

私はC++ 11以降でこれをしようとするだろう:

void changeIntVals(QList<int>& valList) 
{ 
    for(auto& val: valList) 
    { 
     val -= 1; 
    } 
} 

P.S.コンパイルしようとしていない。

+0

ニーニー..それはありがとうございますサー – GeneCode

3

は言う:それは foreachループに入ったときに

Qtが自動的にコンテナのコピーを取ります。反復処理中にコンテナを変更すると、 はループに影響しません。 (あなたは、コンテナを変更しない場合は、コピー はまだ行われますが、コンテナ をコピーする暗黙の共有のおかげで非常に高速です。)

のforeachは、コンテナのコピーを作成するので、非const リファレンスを使用して変数の元の コンテナを変更することはできません。コピーにのみ影響しますが、これはおそらくあなたが望むものではありません。 。

Qtのforeachループの代わりに、C++ 11以降の 部分の範囲ベースがあります。しかし、範囲ベースの は、Qtコンテナに強制的にデタッチさせる可能性がありますが、foreachはそうしないことに注意してください。 しかし、foreachを使用するとコンテナが常にコピーされますが、通常はSTLコンテナには安価な ではありません。疑問がある場合は、Qt コンテナの場合はforeachを、STLの場合は範囲​​を基準にしてください。

+0

ああ、私は.....だから、代わりに通常のforループを使用する必要がありますか? – GeneCode

+1

はい、そうです。 – Dmitry