为什么在循环条件下使用!=来比较迭代器?



在许多关于迭代vector的例子中,我注意到通常使用不等于操作符来检查循环是否到达vector的末端。通常,我在循环条件中使用低于操作符。因此,我想知道,选择!=的理由是什么?

的例子:

std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto iter = vec.begin(); iter != vec.end(); iter++) {
std::cout << *iter << " ";
}

因为不是所有的迭代器都支持排序,但是所有的迭代器都可以比较O(1)中的相等性。

例如,关联(有序)容器使用双向迭代器,定义为(cppreference):
template<class I>
concept bidirectional_iterator =
std::forward_iterator<I> &&
std::derived_from</*ITER_CONCEPT*/<I>, std::bidirectional_iterator_tag> &&
requires(I i) {
{ --i } -> std::same_as<I&>;
{ i-- } -> std::same_as<I>;
};

std::forward_iterator只能被解引用、复制、==和递增。

std::vector使用的随机访问迭代器需要std::totally_ordered<I>。因此,在您的情况下,您可以编写iter < vec.end();,但代码将变得不那么通用。只要不在循环体中对迭代器进行自增操作,就可以保证安全。

根据我的理解,
iterator在stl中有一个实现,使您能够"迭代"。在元素之上。使用它们,程序员不必编写逻辑来移动到下一个元素,这取决于它在其中实现的数据结构。

也就是说,元素并不总是按顺序存储在内存中。因此,与索引相反,它们不能只比较为小于或大于。

对于vector,你可以选择在比较元素位置时使用index。但其他DS的情况却并非如此。

所以,在你的问题中,迭代器的实现允许通过比较最后一个元素是否到达来跨遍所有元素。

相关内容

  • 没有找到相关文章

最新更新