簡體   English   中英

range-for 迭代器類是如何工作的?

[英]How does range-for iterator class work?

我知道,這段代碼是如何工作的:

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_exprend_expr定義如下:

  • 如果range_expression數組類型的表達式,則begin_expr__range並且end_expr(__range + __bound) ,其中__bound是數組中元素的數量(如果數組大小未知或類型不完整,則程序有問題-形成)

  • 如果range_expression是具有名為begin的成員和/或名為end的成員(無論此類成員的類型或可訪問性如何)的類類型C的表達式,則begin_expr__range.begin()並且end_expr__range.end();

  • 否則, begin_exprbegin(__range)end_exprend(__range) ,它們是通過參數相關查找找到的(不執行非 ADL 查找)。

std::filesystem::directory_iterator

directory_iterator的情況下,它是上面的第三個選項,因為它具有beginend非成員函數,這允許它在基於范圍的 for 循環中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM