c++ - map.erase(map.end())?

标签 c++ stl map iterator

考虑:

#include <map>

int main()
{
    std::map< int, int > m;
    m[ 0 ] = 0;
    m[ 1 ] = 1;

    m.erase( 0 );  // ok
    m.erase( 2 );  // no-op
    m.erase( m.find( 2 ) );  // boom!
}

(好的,所以标题谈到删除 end() 迭代器,但 find 将返回 end() 以获得不存在的键。)

为什么删除不存在的 key OK,但删除 end() 却失败了。我在标准中看不到任何明确提及这一点?

我已经在 VS2005(在调试配置中抛出异常)和 GCC 4.0.1(100% CPU)上试过这个。是否依赖于实现?

谢谢。

最佳答案

对于 erase(key),标准规定所有具有值 key 的元素都被删除。当然可能没有这样的值。

对于 erase(it)(其中 it 是一个 std::map::iterator),标准说元素指向到它被删除 - 不幸的是,如果它是 end() 它不指向一个有效的元素并且你在 undefined behavior 土地上,你会是如果您将 end() 用于任何其他 map 操作。有关详细信息,请参阅第 23.1.2 节。

关于c++ - map.erase(map.end())?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/952888/

相关文章:

c++ - 将目录链接到标准输入

c++ - 通过 make_unique/make_shared 调用 initializer_list 构造函数

c++ - 将 vector<reference_wrapper<int>> 传递给 vector<int>?

c++ - 调用 std::map::clear 的段错误

c++ - 制作一个从函数返回字符串的数字拼写程序

c++ - CUDA/推力图像处理

c++ - C++ 中的分配器用法(STL 树)

c++ - 使用 set_difference 时出现编译错误

c++ - 如何找到 2 张 map 中所有常见的键?

json - Apache Hive : Convert Map<string, string> 到 json 字符串?