gpt4 book ai didi

c++ - 如何将 recursive_directory_iterator 与算法库一起使用,尤其是 std::remove_if?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:41:58 26 4
gpt4 key购买 nike

我想使用标准算法从递归目录列表中过滤掉一些条目。假设只留下常规文件。STL 中的一些算法确实有效,例如std::count_if,但其他的,例如 std::remove_if,则不这样做。

它应该工作还是 recursive_directory_iterator 故意不(完全)兼容 STL?

给定 recursive_directory_iterator 是否有一种方法可以仅以函数式编程风格处理常规文件(并可能在之后链接其他过滤器)?

#include <algorithm>
#include <experimental/filesystem>
#include <iostream>

namespace fs = std::experimental::filesystem;

int main()
{
{ // count_if is fine
auto dir_listing = fs::recursive_directory_iterator("/tmp/myfiles");
auto n = std::count_if(begin(dir_listing), end(dir_listing), [](auto &p) { return fs::is_regular_file(p); });
std::cout << n << '\n';
}

{ // remove_if does not even compile
auto dir_listing = fs::recursive_directory_iterator("/tmp/myfiles");
auto my_files = std::remove_if(begin(dir_listing), end(dir_listing), [](const fs::path &p) { return !fs::is_regular_file(p); });
for (auto &f : my_files)
{
std::cout << f << '\n';
}
}
}

用 gcc-7 编译会导致错误(clang-5 也是​​)

g++-7 myfiles.cpp -std=c++1z -lstdc++fs
...
/usr/include/c++/7/bits/stl_algo.h:871:16: error: passing ‘const std::experimental::filesystem::v1::directory_entry’ as ‘this’ argument discards qualifiers [-fpermissive]
*__result = _GLIBCXX_MOVE(*__first);

在添加 -fpermissive 之后它只是段错误。

最佳答案

std::remove_if 需要前向迭代器,指向移动可赋值的值。 recursive_directory_iterator 是一个输入迭代器,它指向的值是 const(因此不可移动赋值)。

我不确定你到底想做什么,但是 std::remove/remove_if 是为了从集合中删除项目。并非所有迭代器都指向集合,recursive_directory_iterator 就是这种情况。

如果您尝试将它用作您希望可能转发给其他算法的过滤器,不幸的是标准库没有直接支持它。您(使用标准库)可能做的最好的事情是使用 remove_copy_ifback_inserter 将元素过滤到 vector 中,然后对该 vector 进行进一步处理。

std::vector<fs::path> paths;
std::remove_copy_if(begin(dir_listing), end(dir_listing), std::back_inserter(paths),
[](const fs::path& p) {
return !fs::is_regular_file(p);
});

关于c++ - 如何将 recursive_directory_iterator 与算法库一起使用,尤其是 std::remove_if?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47312461/

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