一直喜欢python的map,filter和reduce函数,在标准C++中分别有std::transform(对应python的map),std::copy_if(对应python的filter),std::accumulate(对应python的reduce)。当然这是后话,当年年少无知,就自己造了一下轮子,毕竟我就是一个热衷于造轮子的人。
template <typename Func,typename Container>
auto reduce(Func f,Container &container)
-> decltype(Container::value_type())
{
typedef typename Container::value_type ReturnType;
ReturnType result = ReturnType();
if(container.begin() != container.end())
{
typename Container::const_iterator it;
it = container.begin();
for(result = *(it++);it!=container.end();++it)
{
result = f(result,*it);
}
}
return result;
}
template<typename Func, typename Container>
auto map(Func func, Container& container)
->std::list<decltype(func(Container::value_type))>
{
typedef std::list<decltype(func(Container::value_type()))> ReturnType;
ReturnType result = ReturnType();
for (typename Container::value_type value : container)
{
result.push_back(func(value));
}
return result;
}
template<typename Func, typename Container>
auto filter(Func func, Container& container)
->std::list<decltype(Container::value_type())>
{
typedef std::list<decltype(Container::value_type())> ReturnType;
ReturnType result = ReturnType();
for (typename Container::value_type value : container)
{
if(func(value))
{
result.push_back(value);
}
}
return result;
}
最后提醒一句,上面代码仅供交流学习,如果真的要生产运用,还是建议用C++中标准库。