2

ベクトルでイテレータを使用する方法を学んでいますが、実行時エラーで問題が発生しています。コードのセクションは次のとおりです。

vector<int> nums;
for (int i=0; i<N; i++) { nums.push_back(i+1); }
vector<int>::iterator it = nums.begin();

while(nums.size() > 1)
{
    //cout << *it << " ";
    it = nums.erase(it);                
    for (int i=0; i<m-1; i++)
    {
        if (it == nums.end()) 
            it = nums.begin();
        else 
            ++it;       
    }
}

コメントアウトされた行により、「ベクター イテレーターは参照解除できません」というエラーが表示されます。これは、イテレーターが最後に到達したことに関係していると思われます。声明でそれを説明する

if (it == nums.end()) it = nums.begin();    

無駄に。また、いくつかの「ベクトル反復子はインクリメントできません」というエラーが発生しました。これは、消去機能の使用に関係していることがわかりましたが、使用しました

it = nums.erase(it);

無効化されたイテレータを説明するためです。これは、オンラインのどこでも見つけることができる唯一のアドバイスです。

イテレータがベクトルを複数回スイープし、各パスで特定の値が 1 つだけになるまで消去しようとしています (投稿したコードは実際に数回ループされます)。これらのエラーを排除するための提案がある場合、またはそれらがどこから来ているかを説明できる場合は、本当に感謝します:)

ありがとう、

クリス

4

2 に答える 2

5

使用する場合:

it = nums.erase(it);

it消去された要素の次の要素に設定されます。の最後の要素を消去するとnumsitは を指しnums.end()ます。itそれが指していないことを確認しないend()ため、エラーが発生します。

達成しようとしているロジックを説明していないので、詳しくは説明しません。要素を消去する前に、反復子の検証を追加することをお勧めします。つまり、次のとおりです。

if (it != nums.end())
    it = nums.erase(it);
于 2012-06-15T19:05:09.700 に答える
3

その最後forのループでは、 をチェックしてからit == end()インクリメントします。つまり、場合によっては、が最終要素 ( と等しくない) を指している可能性があり、インクリメントされるため、等しくなり、次の反復が開始されます。 itend()end()while

for ループの後にend()リセットを使用して別のチェックを追加します。begin()

この反復子の使用は少し奇妙です。m を繰り返しインクリメントするよりも、おそらくより良いアプローチがあります。あなたは何をしようとしているのですか?

于 2012-06-15T19:07:07.130 に答える