std :: listの使い方に奇妙な動作が発生しました。問題は、リスト内の現在の要素を削除すると、その要素が無効になることです。 for(auto& iter : list)
ループを持つ要素を調べると、削除されるはずだった要素に固執します。望ましくないstd :: listを削除した結果(C++)
#include <iostream>
#include <list>
#include <memory>
int main() {
std::list<unsigned int> wholeNumbers;
while(wholeNumbers.size() < 20) {
wholeNumbers.push_back(wholeNumbers.size());
}
for(auto wholeNumber : wholeNumbers) {
std::cout << "Deleting entries. Value is: " << wholeNumber << std::endl;
std::cout << "Old size: " << wholeNumbers.size() << std::endl;
wholeNumbers.remove(wholeNumber);
std::cout << "New size: " << wholeNumbers.size() << std::endl;
}
}
この所望の結果がインクリメント値吐き出すことであり、減分サイズ:私はこれを表示する最小のコンパイル例を有しています。しかし、私が経験している結果は次のとおりです。
Deleting entries. Value is: 0
Old size: 20
New size: 19
Deleting entries. Value is: 0
Old size: 19
New size: 19
Deleting entries. Value is: 0
Old size: 19
New size: 19
Deleting entries. Value is: 1901208
Old size: 19
New size: 19
Deleting entries. Value is: 0
Old size: 19
New size: 19
Deleting entries. Value is: 0
Old size: 19
New size: 19
Deleting entries. Value is: 0
Old size: 19
New size: 19
Deleting entries. Value is: 1901208
Old size: 19
New size: 19
これは無限に繰り返されます。
私のコンパイラの情報は次のとおりです。gcc version 5.3.0 (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project)
私は私が意図したとおり、これは動作するはずと信じに間違えていた場合、私は好奇心が強いです。
敬具、
イテレータを無効にしています。 – erip
ああ。あなたのコメントを見て、それは最終的に手がかりになった。私はそれを無効にすると、ポインタはもはや要素に存在しなくなるので、無効になり、次のものに移動することができなくなる。したがって、要素を削除するには、 'for'ループの代わりに' remove_if'文で行う必要があります。ありがとうございました。 –
スポットがあります。いい結論! – erip