gpt4 book ai didi

c++ - std::filesystem::directory_iterator 真的是迭代器吗?

转载 作者:行者123 更新时间:2023-12-02 09:47:40 60 4
gpt4 key购买 nike

有些东西没有意义。根据我读过的内容,你使用 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++ 中的标准容器,这就是它的外观,例如标准 vector 容器。

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)

相当于?

上面基于范围的循环中发生了什么?将该循环理解为“for each i in iterator”是错误的吗? i 值是一个 std::filesystem::directory_entry,但是循环中迭代的是什么?什么容器?

最佳答案

根据 this reference这是一个LegacyInputIterator .所以是的,它是一个“真正的”迭代器。

有重载begin and end功能。 begin 函数返回未修改的迭代器,end 函数不使用参数而是返回默认构造的迭代器。它们的存在只是为了支持 range-for 循环。

如果你有:

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

然后

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

将为真。


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


要“手动”遍历目录,您只需几乎像任何其他迭代器一样进行:

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';
}

关于c++ - std::filesystem::directory_iterator 真的是迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64155365/

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