2
  for(it1=prime.begin();it1<prime.end();it1++){
        for(it2=it1+1;it2<prime.end();it2++){

            if(*it2%*it1==0){

                prime.erase(it2);
            }

        }
        if(*it1<1000)
        prime.erase(it1);
    }

上記のコードスニペットでは、素数ベクトル2から9999(エラトステネスのふるい)にすでに存在する数の倍数である数を削除しています。また、1000を超える数のみですが、どういうわけかこれらは消去されていません。

誰かが私に理由を説明できますか?

前もって感謝します。

4

2 に答える 2

6

呼び出すerase()と、イテレータが無効になります。削除された要素の後の値へのイテレータである戻り値を使用する必要があります。

it2 = prime.erase(it2);

ただし、この変更を行う場合(これは必須です!)、++it2forループから削除する必要があります。また、の両方の変更を行う必要がありますit1。テストされていないコードは次のとおりです。

for (it1 = prime.begin(); it1 < prime.end();) {
    for(it2 = it1 + 1; it2 < prime.end();) {
        if (*it2 % *it1 == 0)
            it2 = prime.erase(it2);
        else
            ++it2;
    }
    if (*it1 < 1000)
        it1 = prime.erase(it1);
    else
        ++it1;
}

消去it2は、が原因で厳密にに発生するため、無効にならないことに注意してください。したがって、その干渉について心配する必要はありません。it1 it2it2 = it1 + 1

于 2010-12-25T19:17:44.710 に答える
0

アイテムとループを消去する場合は、「it1 = prime.begin();」を実行する必要があります。消去後、再び。アレンジのため。

于 2010-12-25T19:18:05.200 に答える