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

标签 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 是在内部实现为双向链表的,假设像这样的事情不会<是不是正确的?/em> 打印 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是一个双向迭代器,所以覆盖了第一组运算符并且只覆盖了--从第二个开始。

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

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

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

关于C++11 用于 std::list 的基于范围的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52083107/

相关文章:

c++ - 出现数学错误试图计算天然气的基本价格

c++ - 是否可以 boost::bind 到已知类但(尚)未知对象的成员函数?

javascript - 如何将数组中的 'double' 数字保存到新数组中

php - 每个结果的百分比,其中 id = id

java - 如何在for循环中使用数组来计算最小值?

c++ - 如何在将函数作为参数的函数的参数内定义函数

c++ - 如何绑定(bind)到 Cassandra C++ 驱动程序中的 UDT 集合

c++ - For循环下树

c++11 - 异常传播和上下文

c++ - 在即将到来的 c++0x 标准下,我们可以通过这种语法将数组作为参数传递给函数吗?