C++ 迭代器类的范围是如何工作的?
我知道,这个代码是如何工作的:C++ 迭代器类的范围是如何工作的?,c++,for-loop,iterator,C++,For Loop,Iterator,我知道,这个代码是如何工作的: std::vector<int> sth; for (auto const & elem : sth) { } 在这里传递目录\u迭代器作为容器的情况下如何可能?基于范围的for是传统for循环的语法糖 它所做的只是在一个范围内执行for循环 它是一种更具可读性的等价物,相当于在一系列值上(例如容器中的所有元素)进行操作的传统for循环 在后台,编译器将基于范围的for循环转换为如下内容: { auto && __ra
std::vector<int> sth;
for (auto const & elem : sth) { }
在这里传递
目录\u迭代器作为容器的情况下如何可能?基于范围的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\u expression
是array类型的表达式,则begin\u expr
是\uu range
而end\u expr
是(\uu range+\uu-bound)
,其中\uu-bound
是数组中的元素数(如果数组大小未知或类型不完整,则程序格式不正确)
- 如果
range\u表达式
是类类型C
的表达式,其成员名为begin
和/或成员名为end
(无论该成员的类型或可访问性如何),则begin\u expr
是\u range.begin()
和end\u expr
是\u range.end();
- 否则,
begin\u expr
是begin(\uu范围)
,end\u expr
是end(\uu范围)
,通过依赖参数的查找找到(不执行非ADL查找)
std::filesystem::directory\u迭代器
对于directory\u iterator
这是上面的第三个选项,因为它具有非成员函数,允许在基于范围的for循环中使用它。范围迭代适用于实现begin()
和end()的任何类<代码> > fd::DistRyySyter迭代器< /Code >只需实现这两种方法(或声明<代码> STD::开始< <代码> >代码> STD::结束< /Code >)。当你意识到C++是多么棒的时候,你几乎已经达到了目的。我已经达到这一点,但是我已经阅读了关于C++中的Unicode支持(x°α°)。请注意,C++17稍微更改了表达式,这可能是有价值的。
// given "container"
for(auto it = std::begin(container); it != std::end(container); it++)
{
}
{
auto && __range = range_expression ;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin)
{
range_declaration = *__begin;
loop_statement
}
}