- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道这段代码是如何工作的:
std::vector<int> sth;
for (auto const & elem : sth) { }
但是,这段代码对我来说很神秘:
namespace fs = std::filesystem;
for(auto & file : fs::directory_iterator("some/path"))
std::cout << file << std::endl;
这个类 (std::filesystem::directory_iterator
) 是如何工作的,它使我能够遍历整个容器?据我所知,range-for 的工作方式如下:
// given "container"
for(auto it = std::begin(container); it != std::end(container); it++)
{
}
如果在这里将 directory_iterator
作为 container
传递怎么可能?
最佳答案
基于范围的 for 是传统 for 循环的语法糖
它所做的只是在一个范围内执行一个 for 循环。
它与传统的 for 循环在一定范围内运行的值(例如容器中的所有元素)等价,更具可读性。
在幕后,编译器会将基于范围的 for 循环转换为如下内容:
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin)
{
range_declaration = *__begin;
loop_statement
}
}
begin_expr
和end_expr
定义如下:
如果range_expression
是一个array类型的表达式,那么begin_expr
就是__range
和 end_expr
是 (__range + __bound)
,其中 __bound
是数组中元素的个数(如果数组有未知大小或类型不完整,程序格式错误)
如果 range_expression
是一个类类型 C
的表达式,它有一个名为 begin
和/或名为 end
的成员(无论此类成员的类型或可访问性如何),则 begin_expr
是 __range.begin( )
和 end_expr
是 __range.end();
否则,begin_expr
为begin(__range)
,end_expr
为end(__range)
,通过依赖于参数的查找找到它们(不执行非 ADL 查找)。
std::filesystem::directory_iterator
在 directory_iterator
的情况下,它是上面的第三个选项,因为它有 begin
and end
允许它在基于范围的 for 循环中使用的非成员函数。
关于c++ - range-for 迭代器类是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49211146/
我刚开始使用 Dagger 2,想知道与我目前用来实现依赖注入(inject)的技术相比,它有什么优势。 目前,为了实现 DI,我创建了一个具有两种风格的项目:mock 和 prod。在这些风格中,我
我是一名优秀的程序员,十分优秀!