我有一个指向对象的指针容器。指针是基类,层次结构实现虚函数count()
。我想计算容器中count()
的总和。
我目前使用for_each
和lambda函数执行此操作:
size_t sum = 0;
std::for_each(ptrs_.begin(), ptrs_.end(), [&sum](ptr const *p) {
expr += p->count();
});
return sum;
有人可以帮助我使用boost::bind
和std::accumulate
或其他标准算法重新实现此功能吗?
答案 0 :(得分: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());
您可以使用lambda表达式,而不是编写AddCount
。我希望你也可以使用<functional>
中的内容构建它,但我不会这样做。
我还没有测试过任何代码,所以让错误发现开始!