如何使用recursive_directory_iterator特别是算法库和std :: remove_if?

时间:2017-11-15 16:23:30

标签: c++ algorithm stl c++17

我想使用标准算法从递归目录列表中过滤掉一些条目。假设只留下常规文件。 来自STL的一些算法确实起作用,例如std::count_if,但其他人,例如std::remove_if,则不会。{/ 1>

它应该有效还是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后,它只是段错误。

1 个答案:

答案 0 :(得分:3)

GenIndID CptrDate DtLastAlive DtFnlFate 1 BHS_635 2016-02-04 2016-02-04 2016-02-04 2 BHS_636 2016-02-04 2016-02-04 2016-02-04 3 BHS_637 2016-02-04 2016-02-04 2016-02-04 期望前向迭代器,指向移动可分配值。 std::remove_if是一个输入迭代器,它指向的值是const(所以不能移动赋值)。

我不确定您要做什么,但recursive_directory_iterator用于从集合中删除项目。并非所有迭代器都指向集合,就像std::remove/remove_if一样。

如果您尝试将其用作可能转发到其他算法的过滤器,遗憾的是标准库没有直接支持。您可以做的最好(使用标准库)使用recursive_directory_iteratorremove_copy_if将元素过滤到矢量中,然后对该矢量进行进一步处理。

back_inserter