我正在编写一个使用 std::map::erase 的简单程序。
该程序很好,但有一些我不明白的地方。
如果我将第一个迭代器超出第二个迭代器的间隔传递给 erase 函数,则该函数不会擦除任何内容。这很好。
另一方面,如果我将 std::distance 与第二个迭代器之外的第一个迭代器一起使用,则此函数“失败”。我知道这是由于 map 迭代器的性质造成的,例如使用 std::vector 就没有这个问题。
但我不明白 map::erase 如何知道间隔是否有效。

最佳答案

来自 std::distance 's specification :

对于随机访问迭代器,C++11 之后有一个无关紧要的异常(exception),但这不适用于 map 。这是未定义的行为,因此您可以在这里得到“失败”,甚至崩溃。std::maperase() 方法似乎也表明 this is undefined behavior, too :

您传递的迭代器值不包含“有效范围”,因此这也是未定义的行为。尽管今天这似乎什么也没做,但如果下周您的代码开始崩溃,生成的代码完全在其权利范围内,因为这就是“未定义行为”的含义。
总之,在这种情况下,erase()std::distance 都会导致未定义的行为。

关于c++ - map::erase 如何知道间隔是否有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/65928514/

10-13 08:48