C ++中m.erase函数的奇怪行为?

问题描述

int main(){
    map<int,int> m;
    m.insert({1,2});
    m.insert({2,3});
    m.insert({5,10});
    m.erase(m.find(3));
    for(auto &x: m){
        cout<<x.first<<" "<<x.second<<nl;
    }
}

输出

1 2
5 10

据我所知,如果找不到密钥,m.find(3)会将迭代器返回到m.end()。那么为什么要删除对{2,3}?

解决方法

因为您违反了std::map::erase的先决条件,所以删除了该对

iterator erase( const_iterator pos );
iterator erase( iterator pos );

迭代器pos必须有效且可取消引用。因此,end() 不能使用迭代器(有效但不可取消引用) 作为pos的值。

违反标准库函数的前提条件具有未定义的行为。因此,删除看似随机的元素完全符合要求。