[英]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_expr
和end_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_expr
是begin(__range)
和end_expr
是end(__range)
,它們是通過參數相關查找找到的(不執行非 ADL 查找)。
std::filesystem::directory_iterator
在directory_iterator
的情況下,它是上面的第三個選項,因為它具有begin
和end
非成員函數,這允許它在基於范圍的 for 循環中使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.