std::filesystem::directory_迭代器真的是迭代器吗



有些事情没有意义。根据我所读到的内容,您使用的std::文件系统如下:

#include <iostream>
#include <filesystem>
#include <string>

int main()
{
auto iterator = std::filesystem::directory_iterator("c:/somefolder");
for (auto& i : iterator)
{
i.exists();
i.file_size();
}
}

我将基于范围的循环读作";对于迭代器中的每个i,调用i.file_size(("。对于C++中的标准容器,这就是它的外观,例如标准向量容器。

std::filesystem::directory_迭代器似乎不一致。迭代器应该指向容器中的元素,但对于std::filesystem::directory_迭代器,它似乎是一个容器本身,对吧?基于范围的循环中的每个i是"i";directory_entry";。

如果:

std::vector<int> container;
for (auto& i : container)

相当于:

std::vector<int> container;
for (auto it = std::vector<int>::iterator; it != container.end(); it++)

什么是:

for (auto i : iterator)

相当于?

上面基于范围的循环中发生了什么?把那个循环读成";对于迭代器";?i值是std::filesystem::directory_entry,但循环中迭代的是什么?什么容器?

根据这个引用,它是一个LegacyInputIterator。所以是的,这是一个";真";迭代器。

存在过载的beginend函数。begin函数未修改地返回迭代器,而end函数不使用参数,而是返回默认构造的迭代器。它们的存在只是为了支持循环的范围。

所以,如果你有:

auto iterator = std::filesystem::directory_iterator("c:/somefolder");

然后

iterator == begin(iterator) && std::filesystem::directory_iterator() == end(iterator)

将是真的。


注意,由于begin将返回未修改的迭代器,即使在执行iterator++之后,条件iterator == begin(iterator)也将为true。


要在目录上迭代;手动";你只需要像其他迭代器一样就可以了:

for (auto iterator = std::filesystem::directory_iterator("c:/somefolder");
iterator != std::filesystem::directory_iterator();
iterator++)
{
// Use the iterator
std::cout << "The path is " << iterator->path() << 'n';
}

基于范围的for循环使用std::beginstd::end:过载

directory_iterator begin( directory_iterator iter ) noexcept;
directory_iterator end( const directory_iterator& ) noexcept;

注意在directory_iterator上调用begin如何返回directory_iterator本身,而end忽略其参数并"返回";返回一个默认构造的directory_迭代器,该迭代器用作结束迭代器">

基于范围的for循环并不总是需要容器才能工作。它还可以在一个范围内循环,这就是它在这种情况下所做的。

基于范围的for循环结构如下:

auto && __range = range_expression ;
for ( ; begin_expr != end_expr ; ++begin_expr) {
range_declaration = *__begin;
loop_statement
} 

其中begin_exprend_expr为:

否则,begin_exprbegin(__range)end_exprend(__range),它们是通过参数相关查找找到的(非ADL不执行查找(。

由于directory_iterator重载beginend,因此其功能与正常的LegacyInputIterator一样。

for (auto i : iterator)

我们实际上并不是";在迭代器上循环";正如您对容器所做的那样,因为迭代器本身不是容器,正如您所指出的,我们正在访问迭代器并在重复时递增它,直到到达end()。这里的容器是directory_entry

最新更新