如何解决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的值。
违反标准库函数的前提条件具有未定义的行为。因此,删除看似随机的元素完全符合要求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。