Сколько раз цикл выполняется во время стирания карты c ++ - PullRequest
0 голосов
/ 28 октября 2018
void main() {
        map<int, int> m;
        m[1] = 1;
        m[2] = 1;
        for (auto it : m) {
            cout<<"current: "<<it.first<<endl;
            m.erase(1);
            m.erase(2);
        }
    }

Угадайте, сколько раз выполняется этот цикл?Это 2!

Однако, если я уберу «m.erase (1)», цикл будет выполнен один раз.

Я не понимаю, почему цикл выполняется дважды?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

std::map::erase сделает недействительным итератор для стертого элемента.После чего недопустимый итератор используется для операции приращения в цикле диапазона, который вызывает неопределенное поведение.Таким образом, вы не можете сказать, сколько раз он выполняет цикл.

Правильный фрагмент кода должен выглядеть следующим образом:

for(auto it = m.begin(); it != m.end(); )
        if( /*condition */ )
            it = m.erase(it);
        else
            ++it;
0 голосов
/ 28 октября 2018

Я не понимаю, почему цикл выполняется дважды?

Операция удаления внутри цикла делает недействительными итераторы, используемые в цикле.Поведение использования недействительных итераторов не определено.

...