C++11 基于范围的 for 循环,用于 std::list

C++11 Range-based for loop for std::list

本文关键字:循环 用于 std list for 于范围 范围 C++11      更新时间:2023-10-16

如果我正确理解基于范围的 for 循环,它会扩展

for ( range_declaration : range_expression ) loop_statement

{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}

从而增加指针,如果我理解std::list在内部实现为双向链表,那么假设这样的东西不会打印0 1 2 3,因为内存地址不是连续的(由++__begin暗示(?

std::list<int> myList = {0, 1};
std::list<int> otherList = {10, 11};
myList.push_back(2);
myList.push_back(3);
for(auto& i: myList)
std::cout << i << " ";

然而,它确实打印正确。那么,std::list::iterator是否覆盖了范围对环扩展中使用的运算符的行为?

如果我选择实现自己的可迭代数据结构范围,这对我来说尤为重要。

是的,迭代器通常会重载++*->==!=,有时还会重载+ integral--- integral<等,具体取决于"迭代器类别"。

std::list::iterator是双向迭代器,因此覆盖第一组运算符,并且仅从第二组运算符--

迭代器不是指针。 另一方面,指针既是迭代器,也是迭代器所基于的模型。

基本上是指针的迭代器是随机访问容器的迭代器,这些容器连续存储其数据;向量,字符串,数组和initializer_list。

其中大多数仍然不是原始指针,而是围绕指针的包装器。 这既允许一些额外的类型安全性,又允许调试版本执行边界检查和类似的其他检查。

从而增加指针

不,递增迭代器

std::list迭代器知道该怎么做......否则它将毫无用处,您将无法对列表执行任何操作。 :)

只有对于像向量这样的连续数据,迭代器才能实现为基本指针,尽管即便如此,你也会经常发现迭代器类型至少是指针的某种包装器(例如,在调试模式下,Visual Studio 添加了边界检查(。