Gre*_*een 2 c++ iterator loops
在许多有关迭代向量的示例中,我注意到通常使用不等于运算符来检查循环是否已到达向量的末尾。通常,我在循环条件中使用小于运算符。因此,我想知道,选择的理由是什么!=?
例子:
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto iter = vec.begin(); iter != vec.end(); iter++) {
std::cout << *iter << " ";
}
Run Code Online (Sandbox Code Playgroud)
因为并非所有迭代器都支持排序,但所有迭代器都可以在 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>;
};
Run Code Online (Sandbox Code Playgroud)
std::forward_iterator只能取消引用、复制、==和递增。
另一方面,std::vectorrequires使用的随机访问迭代器std::totally_ordered<I>。因此,在您的情况下,您可以编写iter < vec.end();,但代码将变得不那么通用。只要您不增加循环体中的迭代器,无论如何您都是安全的。