有些事情没有意义。根据我所读到的内容,您使用的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。所以是的,这是一个";真";迭代器。
存在过载的begin
和end
函数。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::begin
和std::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_expr
和end_expr
为:
否则,
begin_expr
是begin(__range)
,end_expr
是end(__range)
,它们是通过参数相关查找找到的(非ADL不执行查找(。
由于directory_iterator
重载begin
和end
,因此其功能与正常的LegacyInputIterator
一样。
for (auto i : iterator)
我们实际上并不是";在迭代器上循环";正如您对容器所做的那样,因为迭代器本身不是容器,正如您所指出的,我们正在访问迭代器并在重复时递增它,直到到达end()
。这里的容器是directory_entry
。