Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在算法库和std::remove_中使用递归_目录_迭代器?_C++_Algorithm_Stl_C++17 - Fatal编程技术网

C++ 如何在算法库和std::remove_中使用递归_目录_迭代器?

C++ 如何在算法库和std::remove_中使用递归_目录_迭代器?,c++,algorithm,stl,c++17,C++,Algorithm,Stl,C++17,我想使用标准算法从递归目录列表中筛选出一些条目。比如说只留下常规文件。 STL中的一些算法可以工作,例如std::count_if,但其他算法,例如std::remove_if,则不能工作 它应该工作还是递归目录迭代器故意与STL不完全兼容 给定递归\u目录\u迭代器,是否有一种方法仅以函数式编程风格处理常规文件,然后可能链接其他过滤器 #include <algorithm> #include <experimental/filesystem> #include <

我想使用标准算法从递归目录列表中筛选出一些条目。比如说只留下常规文件。 STL中的一些算法可以工作,例如std::count_if,但其他算法,例如std::remove_if,则不能工作

它应该工作还是递归目录迭代器故意与STL不完全兼容

给定递归\u目录\u迭代器,是否有一种方法仅以函数式编程风格处理常规文件,然后可能链接其他过滤器

#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';
    }
  }
}
在添加-fppermission之后,它只是segfaults。

std::remove\u如果需要前向迭代器,则指向移动可分配值。递归目录迭代器是一个输入迭代器,它指向的值是常量,因此不可移动分配

我不确定您到底想做什么,但是std::remove/remove_if用于从集合中删除项目。并非所有迭代器都指向集合,递归目录迭代器就是这样

如果您试图将其用作可能要转发到其他算法的过滤器,不幸的是,标准库对此没有直接支持。使用标准库可以做的最好的事情是使用remove_copy_if with back_inserter将元素过滤到向量中,然后对该向量进行进一步处理

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);
    });
如果需要前向迭代器,则删除_,指向移动可分配值。递归目录迭代器是一个输入迭代器,它指向的值是常量,因此不可移动分配

我不确定您到底想做什么,但是std::remove/remove_if用于从集合中删除项目。并非所有迭代器都指向集合,递归目录迭代器就是这样

如果您试图将其用作可能要转发到其他算法的过滤器,不幸的是,标准库对此没有直接支持。使用标准库可以做的最好的事情是使用remove_copy_if with back_inserter将元素过滤到向量中,然后对该向量进行进一步处理

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

如果要在此处执行remove_,您希望它做什么?给定递归目录迭代器,是否有一种方法可以仅以函数式编程方式处理常规文件,并在之后链接其他过滤器?仅使用标准迭代器不太可能。看看哪一个允许链接。或者Eric Niebler的range-v3库:如果在这里执行,您希望删除什么?给定递归目录迭代器,有没有一种方法可以仅以函数式编程风格处理常规文件,然后可能链接其他过滤器?仅使用标准迭代器不太可能。看看哪一个允许链接。或者Eric Niebler的range-v3库:也正是我要写的@sciamano这有助于了解。如果函数需要某个类别,则只能向其传递与预期类别左侧相同或限制较少的类别的迭代器。另外,使用begindir_列表和enddir_列表意味着对递归目录迭代器的误解。它不像std::vector那样是一个集合。@zett42:它不是一个集合,但它仍然支持开始和结束。begin返回迭代器本身,end返回默认构造的迭代器。虽然感觉有点奇怪,但很有趣。它可能只是为了方便起见,因为范围尚未成为标准。@zett42:是的,它主要是为了让你可以将它传递给基于范围的for循环。这正是我要写的。;-@sciamano这有助于了解。如果函数需要某个类别,则只能向其传递与预期类别左侧相同或限制较少的类别的迭代器。另外,使用begindir_列表和enddir_列表意味着对递归目录迭代器的误解。它不像std::vector那样是一个集合。@zett42:它不是一个集合,但它仍然支持开始和结束。begin返回迭代器本身,end返回默认构造的迭代器。虽然感觉有点奇怪,但很有趣。它可能只是为了方便起见,因为范围尚未成为标准。@zett42:是的,它主要是为了让您可以将它传递给基于范围的for循环。