gpt4 book ai didi

c++ - range-for 迭代器类是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 05:03:53 28 4
gpt4 key购买 nike

我知道这段代码是如何工作的:

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是一个array类型的表达式,那么begin_expr就是__range end_expr(__range + __bound),其中 __bound 是数组中元素的个数(如果数组有未知大小或类型不完整,程序格式错误)

  • 如果 range_expression 是一个类类型 C 的表达式,它有一个名为 begin 和/或名为 end 的成员(无论此类成员的类型或可访问性如何),则 begin_expr__range.begin( )end_expr__range.end();

  • 否则,begin_exprbegin(__range)end_exprend(__range),通过依赖于参数的查找找到它们(不执行非 ADL 查找)。

std::filesystem::directory_iterator

directory_iterator 的情况下,它是上面的第三个选项,因为它有 begin and end允许它在基于范围的 for 循环中使用的非成员函数。

关于c++ - range-for 迭代器类是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49211146/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com