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

Strange behaviour of m.erase() function in c++?

本文关键字:函数 erase c++      更新时间:2024-04-28
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 );

迭代器位置必须有效且可取消引用。因此结束((迭代器(有效,但不可取消引用(无法使用作为位置的值

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