Vector :: erase () does not work as expected

  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);
    }

In the above code snippet, I delete numbers that are multiples of the number already existing in the main vector from 2 to 9999 (Eratosthenes sieve). In addition, I only that the numbers are more than 1000, but for some reason they are not erased.

can someone explain to me why?

Thanks in advance.

+3
source share
2 answers

The call erase()cancels the iterator. You should use the return value, which is an iterator, to the value after the element to be deleted, for example.

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. .

+7

, 'it1 = prime.begin();' . - .

0

Source: https://habr.com/ru/post/1782107/


All Articles