c++ 中 m.erase() 函数的奇怪行为?

Sha*_*thi 0 c++ dictionary stl ordered-map

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 2
5 10
Run Code Online (Sandbox Code Playgroud)

据我所知,m.find(3)将迭代器返回到m.end()if 键未找到。那为什么要删除 {2,3} 对呢?

Sto*_*ica 6

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

iterator erase( const_iterator pos );
iterator erase( iterator pos );
Run Code Online (Sandbox Code Playgroud)

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

违反标准库函数的先决条件具有未定义的行为。所以删除一个看似随机的元素完全符合这一点。