首页 >后端开发 >C++ >在 C 中比较来自不同容器的迭代器是否有效?

在 C 中比较来自不同容器的迭代器是否有效?

Barbara Streisand
Barbara Streisand原创
2024-11-02 09:02:291013浏览

Is It Valid to Compare Iterators from Different Containers in C  ?

比较不同容器中的迭代器

使用容器时,了解比较不同容器中迭代器的含义至关重要。问题出现了:是否允许比较属于不同容器的迭代器?

考虑以下代码:

<code class="cpp">std::vector<int> foo;
std::vector<int> bar;
std::cout << (foo.begin() == bar.begin());</code>

表达式 foo.begin() == bar.begin()产生 false 或导致未定义的行为?

深入研究 C 11 标准 (n3337) 可以阐明这个困境:

同一序列中的迭代器

  • 第 24.2.1 节规定,如果存在使 i 等于 j 的 i 操作的有限序列,则两个迭代器 i 和 j 被认为是可达的。
  • 如果 j 从 i 可达,它们引用来自同一序列的元素。

比较来自不同容器的迭代器

  • ForwardIterators,其中包括 RandomAccessIterators,受第 24.2 节的约束。 5.
  • 本节指定 == 只能用于比较同一底层序列上的迭代器。

考虑到这些要求,比较来自不同容器的迭代器是未定义的行为。

LWG 问题 #446

LWG 问题 #446 明确解决了这个问题,建议对标准添加以下内容:

“直接或间接评估任何比较函数或二元 - 运算符,以两个迭代器值作为参数,这两个迭代器值是从两个不同范围 r1 和 r2 [...] 获得的,这两个范围不是一个公共范围的子范围,这是未定义的,除非另有明确说明。”

总之,比较来自不同容器的迭代器是未定义的行为,在代码中编写自定义迭代器和操作容器时遵守此约束至关重要。

以上是在 C 中比较来自不同容器的迭代器是否有效?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn