std::list 的 C++11 基于范围的 for 循环
C++11 Range-based for loop for std::list
如果我正确理解基于范围的 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
s 在内部实现为双向链表,那么假设这样的事情 不会 [=29] 是不是正确的? =] 打印 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
是双向迭代器,因此会覆盖第一组运算符,并且仅覆盖第二组运算符 --
。
迭代器不是指针。另一方面,指针既是迭代器,也是迭代器所基于的模型。
基本上是指针的迭代器是随机访问容器的迭代器,这些容器连续存储它们的数据;矢量、字符串、数组和 initializer_list.
其中大部分仍然不是原始指针,而是指针的包装器。这既允许一些额外的类型安全,又允许调试版本进行边界检查和类似的其他检查。
thus incrementing the pointer
不,递增 迭代器。
而 std::list
迭代器知道该做什么……否则它将毫无用处,您将无法对您的列表执行任何操作。 :)
只有对于像向量这样的连续数据,迭代器才能实现为基本指针,尽管即使那样你也会经常发现迭代器类型至少是指针的某种包装器(例如在调试模式下Visual Studio 添加边界检查)。
如果我正确理解基于范围的 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
s 在内部实现为双向链表,那么假设这样的事情 不会 [=29] 是不是正确的? =] 打印 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
是双向迭代器,因此会覆盖第一组运算符,并且仅覆盖第二组运算符 --
。
迭代器不是指针。另一方面,指针既是迭代器,也是迭代器所基于的模型。
基本上是指针的迭代器是随机访问容器的迭代器,这些容器连续存储它们的数据;矢量、字符串、数组和 initializer_list.
其中大部分仍然不是原始指针,而是指针的包装器。这既允许一些额外的类型安全,又允许调试版本进行边界检查和类似的其他检查。
thus incrementing the pointer
不,递增 迭代器。
而 std::list
迭代器知道该做什么……否则它将毫无用处,您将无法对您的列表执行任何操作。 :)
只有对于像向量这样的连续数据,迭代器才能实现为基本指针,尽管即使那样你也会经常发现迭代器类型至少是指针的某种包装器(例如在调试模式下Visual Studio 添加边界检查)。