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::map
的erase()
方法似乎也表明this is undefined behavior, too:
- Removes the elements in the range [first; last), which must be a
valid range in *this.
您传递的迭代器值不包含“有效范围”,因此这也是未定义的行为。尽管今天这似乎什么都不做,但如果下周您的代码开始崩溃,生成的代码完全在其权利之内,因为这就是“未定义行为”的意思。
总之,erase()
和 std::distance
在这种情况下都会导致未定义的行为。
没有!
它只是假定该范围有效,只有当它不是导致某些意外症状时,您才会注意到它不是。
这是否会发生完全取决于内部实现的细节,而且很可能是偶然的。这是教科书中未定义的行为。
我正在编写一个使用 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::map
的erase()
方法似乎也表明this is undefined behavior, too:
- Removes the elements in the range [first; last), which must be a valid range in *this.
您传递的迭代器值不包含“有效范围”,因此这也是未定义的行为。尽管今天这似乎什么都不做,但如果下周您的代码开始崩溃,生成的代码完全在其权利之内,因为这就是“未定义行为”的意思。
总之,erase()
和 std::distance
在这种情况下都会导致未定义的行为。
没有!
它只是假定该范围有效,只有当它不是导致某些意外症状时,您才会注意到它不是。
这是否会发生完全取决于内部实现的细节,而且很可能是偶然的。这是教科书中未定义的行为。