m.erase() 函数在 C++ 中的奇怪行为?
Strange behaviour of m.erase() function in c++?
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)
returns 如果找不到密钥,m.end()
的迭代器。那为什么删除对{2,3}呢?
该对已删除,因为您违反了 std::map::erase
的 pre-condition
iterator erase( const_iterator pos );
iterator erase( iterator pos );
The iterator pos must be valid and dereferenceable. Thus the end()
iterator (which is valid, but is not dereferenceable) cannot be used
as a value for pos.
违反标准库函数的 pre-condition 具有未定义的行为。所以删除一个看似随机的元素完全符合这一点。
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)
returns 如果找不到密钥,m.end()
的迭代器。那为什么删除对{2,3}呢?
该对已删除,因为您违反了 std::map::erase
iterator erase( const_iterator pos ); iterator erase( iterator pos );
The iterator pos must be valid and dereferenceable. Thus the end() iterator (which is valid, but is not dereferenceable) cannot be used as a value for pos.
违反标准库函数的 pre-condition 具有未定义的行为。所以删除一个看似随机的元素完全符合这一点。