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 
    } 
}