【发布时间】:2021-01-17 04:12:49
【问题描述】:
有些事情没有意义。根据我读到的内容,您可以像这样使用 std::filesystem :
#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_iterator 似乎不一致。迭代器应该指向容器中的元素,但是对于 std::filesystem::directory_iterator 它似乎是一个容器本身,对吧?基于范围的循环中的每个 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”是错误的吗? i 值是 std::filesystem::directory_entry,但在循环中迭代的是什么?什么容器?
【问题讨论】:
-
A
directory_iteratoris 是一个有效的迭代器,您可以按常规方式使用它(递增、比较、取消引用)。它也可以以你的显示方式使用,作为一个范围。 -
@BobTFish 在这个例子中,什么是迭代器?如果没有基于范围的 for 循环,这将如何编写,所以我可以理解。
-
似乎停留在对容器的需求上,而不是迭代器设计模式的意图。就像提供一个通用的迭代接口。您的频道向上/向下按钮是迭代器。您的第一个代码块也是无意义的。
exists()返回一个布尔值,但您不关心它或对其进行任何检查。您也不会对文件大小做任何事情。正如答案所指出的那样,您似乎也误解了基于范围的 for 循环所需要的内容。
标签: c++ iterator filesystems range-based-loop