0
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()if 键未找到。那么为什么要删除对 {2,3} 呢?

4

1 回答 1

6

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

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

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

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

于 2020-09-23T15:25:07.997 回答