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>
例如的非迭代器版本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>