基于C ++ 11的std :: list

时间:2018-08-29 17:24:25

标签: c++ c++11 for-loop stdlist

如果我正确地理解了基于范围的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在内部实现为双链表,那么假设这样的东西不会 打印{{ 1}},因为内存地址不是顺序的(由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 << " "; 是否会覆盖用于范围扩展的运算符的行为?

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

2 个答案:

答案 0 :(得分:11)

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

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

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

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

大多数仍然不是原始指针,而是指针周围的包装器。这不仅增加了一些类型安全性,还允许调试版本进行边界检查和类似的其他检查。

答案 1 :(得分:6)

  

因此增加指针

不是,增加迭代器

一个std::list迭代器知道该怎么做……否则它将没有用,并且您将无法对列表做任何事情。 :)

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