反復器の使用--反復器の失効について
これはプログラマーの面接宝典の小さな問題です.
ポイントは、eraseを使用すると反復器が無効になります.
実際に無効になったのは、元の反復器で、1つの要素を削除した後、自動的に次の要素を指します.
テストコードは、コンテナの値が6のすべての要素を削除します.
Aエラーのコードは次のとおりです.
出力の結果は:1,6,3.2番目の6は削除されていません.
B修正後のコードは以下の通りである.
結果は1,3
これにより、eraseを使用すると、反復器は次の要素を自動的に指します.
ポイントは、eraseを使用すると反復器が無効になります.
実際に無効になったのは、元の反復器で、1つの要素を削除した後、自動的に次の要素を指します.
テストコードは、コンテナの値が6のすべての要素を削除します.
Aエラーのコードは次のとおりです.
#include <iostream>
#include <vector>
using namespace std;
void print(vector<int>);
int main()
{
vector<int> array;
array.push_back(1);
array.push_back(6);
array.push_back(6);
array.push_back(3);
vector<int> :: iterator itor;
for (itor = array.begin(); itor != array.end(); itor++)
{
if (6 == *itor)
{
array.erase(itor);
}
}
cout << "vector size is: " << array.size() << endl;
for (itor = array.begin(); itor != array.end(); itor++)
{
cout << *itor << " " << endl;
}
return 0;
}
出力の結果は:1,6,3.2番目の6は削除されていません.
B修正後のコードは以下の通りである.
#include <iostream>
#include <vector>
using namespace std;
void print(vector<int>);
int main()
{
vector<int> array;
array.push_back(1);
array.push_back(6);
array.push_back(6);
array.push_back(3);
vector<int> :: iterator itor;
for (itor = array.begin(); itor != array.end();)
{
if (6 == *itor)
{
array.erase(itor);
}
else
itor++;
}
cout << "vector size is: " << array.size() << endl;
for (itor = array.begin(); itor != array.end(); itor++)
{
cout << *itor << " " << endl;
}
return 0;
}
結果は1,3
これにより、eraseを使用すると、反復器は次の要素を自動的に指します.