C++11 基于范围的 for 循环,用于 std::list
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
在内部实现为双向链表,那么假设这样的东西不会打印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
和<
等,具体取决于"迭代器类别"。
std::list::iterator
是双向迭代器,因此覆盖第一组运算符,并且仅从第二组运算符--
。
迭代器不是指针。 另一方面,指针既是迭代器,也是迭代器所基于的模型。
基本上是指针的迭代器是随机访问容器的迭代器,这些容器连续存储其数据;向量,字符串,数组和initializer_list。
其中大多数仍然不是原始指针,而是围绕指针的包装器。 这既允许一些额外的类型安全性,又允许调试版本执行边界检查和类似的其他检查。
从而增加指针
不,递增迭代器。
std::list
迭代器知道该怎么做......否则它将毫无用处,您将无法对列表执行任何操作。 :)
只有对于像向量这样的连续数据,迭代器才能实现为基本指针,尽管即便如此,你也会经常发现迭代器类型至少是指针的某种包装器(例如,在调试模式下,Visual Studio 添加了边界检查(。
相关文章:
- 用于C++中带有数组和指针的循环
- 并行用于C++17中数组索引范围内的循环
- 用于循环编译的 constexpr
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- 删除功能不适用于串行通信后多个循环中的多个实例
- C++ for 循环,用于反转数字 10 - 99
- C++用于循环跳过向量的元素?
- OpenMP 内部的函数调用用于循环
- C++11 基于范围的 for 循环,用于 std::list
- 循环中的线程 Runnin 用于对 c++ 中的数字求和
- 将 mmap 内存用于开销非常低的循环缓冲区
- 用于循环访问多个集合的数据结构
- 一个 2D 数组,并按行存储值.第一个循环用于行索引,第二个循环用于列索引
- Leetcode C++用于循环条件
- 相同的 for 循环适用于其他项目,但不适用于此项目。为什么?
- C++ 中用于二维数组的 for-each 循环
- 打开 MP 三用于减少的循环
- 虽然循环不适用于数组应用程序
- 用于增加 ASCII 值的循环
- 这种无操作 while 循环用于断言宏的原因是什么?