C ++ copy_if,transform等的功能版本

时间:2016-04-19 16:58:14

标签: c++ stl-algorithm

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

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

但我不认为你可以对返回容器的算法做同样的事情吗?

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

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

2 个答案:

答案 0 :(得分:4)

您应该使用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的要求,而是SequenceContainerAssociativeContainer的要求(表格不完整,但[associative.reqmts]需要它(表102))。

如果您确实想要使用向量而Container尊重Container概念,那么您可以使用以下方式访问其值类型:

typename Container::value_type

E.g:

std::vector<typename Container::value_type>

答案 1 :(得分:1)

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

*std::begin(c)

通过decltype

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

或通过汽车:

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