C++ copy_if、转换等的函数式版本

Functional versions of C++ copy_if, transform etc

例如的非迭代器版本all_of可以写成:

template <class Container, class UnaryPredicate>
bool all_of(Container s, UnaryPredicate f) {
  return all_of(s.begin(), s.end(), f);
}

但我认为您不能对 return 容器的算法做同样的事情?

template <class Container, class UnaryPredicate>
Container copy_if(Container, UnaryPredicate);

我最接近的实现是使用向量来保存中间结果,但由于缺乏任何方式为向量提供模板参数而绊倒了。有什么我想念的吗?

我认为最好的方法是采用(假设Container c)的类型:

*std::begin(c)

或者通过 decltype:

using T = decltype(*std::begin(c));

或通过自动:

auto elem = *std::begin(c);

你应该使用 std::insert_iterator 而不是使用 vector 来保存你的临时文件:

template <class Container, class UnaryPredicate>
Container copy_if(Container const& input, UnaryPredicate const& up) {
    Container tmp;
    std::copy_if(input.begin(), input.end(),
                 std::insert_iterator<Container>(tmp, tmp.begin()), up);
    return tmp;
}

std::insert_iterator 需要你的容器有一个 insert() 方法,这不是 Container but a requirement of both SequenceContainer and AssociativeContainer 的要求(table 不完整,但是 [associative.reqmts] 需要它 (Table 102)).


如果您真的想使用向量并且所有 Container 都遵循 Container 概念,那么您可以使用以下方法访问它们的值类型:

typename Container::value_type

例如:

std::vector<typename Container::value_type>