在许多关于迭代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的情况却并非如此。
所以,在你的问题中,迭代器的实现允许通过比较最后一个元素是否到达来跨遍所有元素。