如何使用标准算法重新实现这一点

How to reimplement this with std algorithms?

本文关键字:实现 这一点 新实现 何使用 标准 算法      更新时间:2023-10-16

我有一个指向对象的指针容器。指针是一个基类,层次结构实现一个虚函数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::bindstd::accumulate或其他标准算法重新实现这一点?

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> 中的东西来构建它,但我不会。

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

相关文章: