如果我正确地理解了基于范围的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 << " ";
是否会覆盖用于范围扩展的运算符的行为?
如果我选择实现自己的范围可迭代的数据结构,这对我来说尤为重要。
答案 0 :(得分:11)
是的,迭代器通常会重载++
,*
,->
,==
,!=
,有时还会重载+ integral
和--
以及- integral
和<
等,具体取决于"iterator category"。
std::list::iterator
是双向迭代器,因此将覆盖第一组运算符,而仅覆盖第二组运算符。
迭代器不是指针。另一方面,指针既是迭代器,也是迭代器所基于的模型。
本质上是指针的迭代器是进入随机访问容器的迭代器,这些容器连续存储其数据;向量,字符串,数组和initializer_list。
大多数仍然不是原始指针,而是指针周围的包装器。这不仅增加了一些类型安全性,还允许调试版本进行边界检查和类似的其他检查。
答案 1 :(得分:6)
因此增加指针
不是,增加迭代器。
一个std::list
迭代器知道该怎么做……否则它将没有用,并且您将无法对列表做任何事情。 :)
仅对于向量之类的连续数据,迭代器才能实现为基本指针,尽管即使这样,您仍经常会发现迭代器类型至少是某种围绕指针的包装器(例如,在调试模式下,Visual Studio添加了边界检查)。