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

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

如果我正确理解基于范围的 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::lists 在内部实现为双向链表,那么假设这样的事情 不会 [=29] 是不是正确的? =] 打印 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< 等,取决于 "iterator category".

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

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

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

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

thus incrementing the pointer

不,递增 迭代器

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

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