在非连续的 C++ 容器中,结束迭代器指向哪里?

问题描述

在 std::vector 之类的东西中,::end() 迭代器将指向最后一个元素。您不能取消引用此迭代器,但可以将其与另一个迭代器进行比较。如果将另一个迭代器与 end() 进行比较,您就知道已经到达容器的末尾。对于不是数组的容器,例如树或链表,这些末端迭代器必须与其他迭代器比较哪些值?

解决方法

C++ 标准以公理方式定义结束迭代器值:

22.2.1 一般容器要求 [container.requirements.general]

...

begin() 返回一个迭代器,该迭代器指的是 容器。 end() 返回一个迭代器,它是最后的值 对于容器。如果容器为空,则 begin() == end()。

“Past-the-end”是您唯一可以使用的公理定义。这就是你所得到的。每个 C++ 实现都可以以任何满足此要求和其他相关要求的方式自由实现结束迭代器值。举个例子:一种可能性是对结束迭代器值使用空指针(前提是还满足所有其他要求,即递减操作产生一个迭代器到(非空)容器中的最后一个元素,并且将迭代器递增到最后一个元素会产生此实现空指针。

当然,这不是唯一可能的实现,但无论您的 C++ 编译器的实际实现如何——这通常与任何格式良好的 C++ 代码无关。格式良好的 C++ 代码不会明确地将特定迭代器与空指针进行比较,以检查结束迭代器值,而是将其与 end() 返回的任何值进行比较。