ベクトルをデバッグしているときに、矛盾が見られます。要素が 1 つしかないベクトルからエントリを削除しようとする次のコードを想定します。
#include <iostream>
#include <vector>
std::vector<int> v;
void myremove(int);
int main()
{
v.push_back(10);
std::cout << "10 pushed back\n";
myremove(10);
std::cout << "done :)\n";
return 0;
}
void myremove( int a )
{
std::vector<int>::iterator it = v.begin();
int counter = 0;
for ( ; it != v.end(); it++ ) {
std::cout << "iterating for " << counter << " times and vector size is " << v.size() << "\n";
if ( a == (*it) ) {
v.erase(it);
std::cout << "removed " << a << "\n";
}
++counter;
}
}
これは、出力に表示されるものです。
$ g++ test.cpp
$ ./a.out | more
10 pushed back
iterating for 0 times and vector size is 1
removed 10
iterating for 1 times and vector size is 0
iterating for 2 times and vector size is 0
iterating for 3 times and vector size is 0
iterating for 4 times and vector size is 0
iterating for 5 times and vector size is 0
iterating for 6 times and vector size is 0
....
....
iterating for 33790 times and vector size is 0
Segmentation fault
私が理解しているのは、要素が削除されるとサイズが0になるということですが、イテレータは1ステップ移動し、それでも最後に到達しようとしますが、彼はすでに終点を通過したことを知りません。
誰かが何が起こっているのか、それを回避する方法をもっと説明できますか?