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

Cod*_*ith 1 c++ for-loop stdlist c++11

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

for ( range_declaration : range_expression ) loop_statement
Run Code Online (Sandbox Code Playgroud)

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

因此增加指针,如果我理解std::lists在内部实现为双链表,那么假设这样的东西不能打印是不正确的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 << " ";
Run Code Online (Sandbox Code Playgroud)

然而它确实打印正确.那么,是否std::list::iterator覆盖了for-for-loop扩展中使用的运算符的行为?

如果我选择实现自己的范围 - 可迭代数据结构,这对我来说特别重要.

Yak*_*ont 11

是的,迭代器通常需要重载++,*,->,==,!=有时+ integral--- integral<等,根据"迭代器类别".

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

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

从根本上指针的迭代器是随机访问容器中的迭代器,它们连续存储它们的数据; vector,string,array和initializer_list.

大多数仍然不是原始指针,而是指针周围的包装器.这两者都允许一些额外的类型安全性,并允许调试版本进行边界检查和类似的其他检查.


Lig*_*ica 6

从而递增指针

不,递增迭代器.

并且std::list迭代器知道该怎么做......否则它将是无用的,你将无法对你的列表做任何事情.:)

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