非迭代器版本的例如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);
我接近实现的最接近的是使用向量来保存中间结果,但是由于缺乏为向量提供模板参数的任何方法而绊倒了。有什么我想念的吗?
答案 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
的要求,而是SequenceContainer
和AssociativeContainer
的要求(表格不完整,但[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);