地图擦除期间执行循环多少次C ++

时间:2018-10-28 01:31:33

标签: c++ dictionary erase

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 :(得分:2)

std::map::erase将使迭代器对被删除的元素无效。之后,无效的迭代器将用于for range循环中的增量操作,从而调用未定义的行为。因此,您基本上无法确定执行循环的次数。

正确的代码段如下所示:

for(auto it = m.begin(); it != m.end(); )
        if( /*condition */ )
            it = m.erase(it);
        else
            ++it;

答案 1 :(得分:0)

  

我对为什么循环执行两次感到困惑?

循环中的擦除操作会使循环中使用的迭代器无效。使用无效迭代器的行为是不确定的。