首页 >后端开发 >C++ >比较 C 中不同容器的迭代器是否定义了行为?

比较 C 中不同容器的迭代器是否定义了行为?

Linda Hamilton
Linda Hamilton原创
2024-11-03 06:03:30758浏览

Is Comparing Iterators from Different Containers in C   Defined Behavior?

比较 C 中不同容器的迭代器

在自定义迭代器实现的上下文中,出现了一个基本问题:是否允许比较迭代器来自不同的容器?以下面的代码片段为例:

<code class="cpp">std::vector<int> foo;
std::vector<int> bar;

// Is this expression valid?
foo.begin() == bar.begin();</code>

根据 C 11 标准:

同一序列中的迭代器:

  • 如果重复应用增量运算符 ( ) 导致相等,则认为迭代器彼此可达。
  • 如果迭代器彼此可达,则迭代器引用相同序列的元素。

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

  • 对于前向迭代器,仅当迭代器属于同一底层序列时才定义迭代器的比较。

因此,比较来自不同容器的迭代器,例如上例中的 foo.begin() 和 bar.begin(),被视为未定义行为

这种未定义行为源于迭代器引用容器内的特定元素这一事实。当迭代器属于不同容器时,不能假定它们指向同一底层序列中的元素,因此它们的比较会产生未定义的结果。

LWG Issue #446:

为了澄清这个问题,LWG 问题 #446 建议将以下文本添加到标准中:

直接或间接评估任何比较函数或二元 - 运算符的结果,其中两个迭代器值作为从以下位置获得的参数两个不同的范围...是未定义的,除非另有明确说明。

此添加进一步强调了比较来自不同容器的迭代器的未定义性质。

以上是比较 C 中不同容器的迭代器是否定义了行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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