map::erase 怎么知道间隔是否有效?

How could map::erase know if the interval is valid?

我正在编写一个使用 std::map::erase 的简单程序。 程序没问题,就是有点不明白

如果我将第一个迭代器超出第二个迭代器的区间传递给 erase 函数,该函数不会删除任何内容。而且还不错。

另一方面,如果我将 std::distance 与第二个迭代器之后的第一个迭代器一起使用,则此函数“失败”。我知道这是由于地图迭代器的性质所致,例如 std::vector 就没有这个问题。

但是我不明白map::erase怎么知道区间是否有效

来自std::distance's specification

The behavior is undefined if last is not reachable from first by (possibly repeatedly) incrementing first.

随机访问迭代器有一个无关紧要的例外 post-C++11,但这不适用于映射。这是未定义的行为,因此您可以在此处获得“失败”甚至崩溃。

std::maperase()方法似乎也表明this is undefined behavior, too:

  1. Removes the elements in the range [first; last), which must be a valid range in *this.

您传递的迭代器值不包含“有效范围”,因此这也是未定义的行为。尽管今天这似乎什么都不做,但如果下周您的代码开始崩溃,生成的代码完全在其权利之内,因为这就是“未定义行为”的意思。

总之,erase()std::distance 在这种情况下都会导致未定义的行为。

没有!

它只是假定该范围有效,只有当它不是导致某些意外症状时,您才会注意到它不是。

这是否会发生完全取决于内部实现的细节,而且很可能是偶然的。这是教科书中未定义的行为。