c++20 ranges 实现 文件广度优先遍历
C++20中的ranges库提供了更加方便的迭代器和范围操作,可以帮助我们更加容易地实现文件广度优先遍历。
首先,需要定义一个函数,用来获取指定目录下的所有文件和子目录:
std::vector<std::filesystem::directory_entry> get_files_and_directories(const std::filesystem::path& path)
{
std::vector<std::filesystem::directory_entry> files_and_directories;
for (const auto& entry : std::filesystem::directory_iterator(path))
{
files_and_directories.push_back(entry);
}
return files_and_directories;
}
这个函数使用std::filesystem::directory_iterator遍历指定目录下的所有文件和子目录,然后将它们存储在一个std::vector中并返回。
接下来,我们需要一个函数来判断一个directory_entry是否是一个目录:
bool is_directory(const std::filesystem::directory_entry& entry)
{
return entry.is_directory();
}
这个函数使用std::filesystem::directory_entry::is_directory方法来判断一个directory_entry是否是一个目录。
然后,我们可以使用ranges库中的views::queue来实现广度优先遍历。views::queue是一个基于队列的视图,它可以让我们按照队列的顺序遍历一个范围。
下面是实现文件广度优先遍历的完整代码:
#include <iostream>
#include <filesystem>
#include <vector>
#include <ranges>
namespace fs = std::filesystem;
namespace views = std::ranges::views;
std::vector<fs::directory_entry> get_files_and_directories(const fs::path& path)
{
std::vector<fs::directory_entry> files_and_directories;
for (const auto& entry : fs::directory_iterator(path))
{
files_and_directories.push_back(entry);
}
return files_and_directories;
}
bool is_directory(const fs::directory_entry& entry)
{
return entry.is_directory();
}
int main()
{
const fs::path root_path = "C:/";
auto files_and_directories = get_files_and_directories(root_path);
auto directories = files_and_directories | views::filter(is_directory);
auto files = files_and_directories | views::filter(!is_directory);
auto bfs = directories | views::queue | views::join(files_and_directories | views::filter(is_directory));
for (const auto& entry : bfs)
{
std::cout << entry.path() << std::endl;
}
return 0;
}
这个程序使用get_files_and_directories函数获取指定目录下的所有文件和子目录,然后使用ranges库中的views::filter视图来筛选出所有的目录和文件,分别存储在directories和files中。
接下来,使用views::queue将directories转换为一个基于队列的视图,然后使用views::join将files_and_directories中的所有目录和文件连接起来,最后得到一个广度优先遍历的视图bfs。
最后,使用一个简单的循环来遍历bfs中的所有文件和子目录,并打印它们的路径。
需要注意的是,这个程序只能在支持C++20的编译器中编译和运行。在使用之前,请确保你的编译器已经支持C++20的ranges库。
原文地址: https://www.cveoy.top/t/topic/sFD 著作权归作者所有。请勿转载和采集!