如果我正确理解基于范围的 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/