【发布时间】:2017-11-15 16:23:30
【问题描述】:
我想使用标准算法从递归目录列表中过滤掉一些条目。假设只留下常规文件。
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 之后,它只是段错误。
【问题讨论】:
-
您到底希望
remove_if在这里做什么? -
给定
recursive_directory_iterator有没有办法只以 功能编程 样式处理常规文件(以及之后可能链接其他过滤器)? -
仅使用标准迭代器并不容易。看看boost range library,它允许链接。
-
或 Eric Niebler 的 range-v3 库:github.com/ericniebler/range-v3