2012-05-31 179 views
1

我有一个指向对象的指针的容器。指针是一个基类,并且该层次结构实现了一个虚函数count()。我想在容器中计算总计count()如何用std算法重新实现?

我目前做这与for_each和lambda函数:

size_t sum = 0; 
std::for_each(ptrs_.begin(), ptrs_.end(), [&sum](ptr const *p) { 
    expr += p->count(); 
}); 
return sum; 

谁能帮我boost::bindstd::accumulate或其他性病的算法重新实现这一点?

+0

为什么'boost :: bind'?这种方法有什么问题? – kennytm

回答

3
auto getcount = std::mem_fun(&Base::count); // nothing to bind, we just need a functor 

size_t sum = std::accumulate(
    boost::make_transform_iterator(ptrs_.begin(), getcount), 
    boost::make_transform_iterator(ptrs_.end(), getcount), 
    (size_t)0 
); 

如果你不喜欢auto,或者更可能的,如果你的编译器没有,那么你当然可以粘贴的东西两次,或去寻找的mem_fun返回类型,或使用捕捉到它函数模板:

template <typename IT, typename FUNC, typename T> 
T transform_accumulate(IT first, IT last, T init, FUNC func) { 
    return std::accumulate(
     boost::make_transform_iterator(first, func), 
     boost::make_transform_iterator(last, func), 
     init 
    ); 
} 

然后称其为:

transform_accumulate(ptrs_.begin(), ptrs_.end(), size_t(), std::mem_fun(&Base::count)); 

或者,使用的std::accumulate,需要一个二元仿函数形式:

struct AddCount { 
    size_t operator()(size_t result, Base *p) const { 
     return result + p->count(); 
    } 
}; 

size_t sum = std::accumulate(ptrs_.begin(), ptrs_.end(), size_t(), AddCount()); 

而不是写AddCount,你当然可以使用lambda表达式。我希望你也可以使用<functional>中的东西构建它,但我不打算。

我还没有测试过任何这个代码,所以让错误发现开始吧!