vector :: erase () не работает должным образом - PullRequest
3 голосов
/ 25 декабря 2010
  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, но почему-то они не стираются.

Может кто-нибудь объяснить, почему?

Спасибо заранее.

Ответы [ 2 ]

7 голосов
/ 25 декабря 2010

Вызов erase() делает итератор недействительным. Вы должны использовать возвращаемое значение, которое является итератором для значения после удаленного элемента, например,

it2 = prime.erase(it2);

Но если вы сделаете это изменение (что необходимо!), Вам нужно удалить ++it2 из цикла for. Вам также необходимо внести оба изменения для 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, потому что это происходит строго до it2 из-за it2 = it1 + 1. Так что вам не нужно беспокоиться об этом вмешательстве.

0 голосов
/ 25 декабря 2010

Если вы хотите стереть элемент и цикл, вам нужно сделать 'it1 = prime.begin ();'снова после стирания.Из-за договоренности.

...