比较来自不同容器的迭代器:一个警示故事
在 C 中,迭代器提供了一种强大的遍历集合的机制。然而,在使用来自不同容器的迭代器时,重要的是要意识到这些限制。
比较来自不同容器的迭代器是否合法的问题经常出现。考虑以下示例:
std::vector foo;
std::vector bar;
std::cout 这个表达式乍一看似乎无害,但它实际上会产生未定义的行为。根据 C 11 标准,迭代器只有引用相同序列的元素才能进行比较。由于 foo 和 bar 是两个不同的向量,因此它们的迭代器不具有可比性。
LWG Issue #446 中进一步强调了这种行为:
“直接或间接评估任何比较函数或的结果以两个迭代器值作为参数的二元 - 运算符是从两个不同范围 r1 和 r2 (...) 获得的,这两个范围不是一个公共范围的子范围,除非另有明确说明,否则未定义。"
此限制对于实现自定义迭代器具有重要意义。如果您计划为自定义迭代器实现运算符 ==,则必须确保它仅比较同一范围内的迭代器。
不遵守此规则可能会导致意外行为,最终是有害的到你的代码的可靠性。因此,重要的是要记住,在 C 中严格禁止比较来自不同容器的迭代器。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3