如何使用标准算法重新实现这一点
How to reimplement this with std algorithms?
我有一个指向对象的指针容器。指针是一个基类,层次结构实现一个虚函数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
或其他标准算法重新实现这一点?
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>
中的东西来构建它,但我不会。
我还没有测试过任何这些代码,所以让错误发现开始吧!
相关文章:
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 我无法理解这一点,有人可以帮我解释一下吗?
- 结构本身就包含在内.如何理解这一点?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 我可以直接为指针分配地址吗?如果是,如何做到这一点
- 请证明这一点的合理性 C++.
- 为什么要按值传递string_view?为什么Visual Studio不能优化这一点?
- [expr.unary.op]/9 似乎暗示"运算符!()' 不能应用于下面的类型 A.但编译器不同意这一点
- 为什么我有一个无限循环,我如何以不同的方式做到这一点
- 我想使用 CMake 生成和编译 Visual Studio projet,我需要从构建中排除单元测试文件。有没有办法做到这一点?
- 所有版本的 GCC 都与默认成员初始值设定项作斗争,该初始值设定项捕获了这一点,并结合了继承的构造函数
- 如果有条件使用String.length()的条件,为什么不一致地评估这一点
- 对随机序列进行降采样会降低随机性吗?有没有原理/定理来证明这一点?
- 在C++有没有更好的方法可以做到这一点?检查哪些数字满足条件 [A*B*C = A! + B! + C!]
- 4.5年应该是4年零178年,我如何在C 中做到这一点
- 为什么添加constexpr使VS2013拒绝这一点
- 如何使用标准算法重新实现这一点
- 我可以在不使用新关键字的情况下以某种方式实现这一点吗?C++
- std:vector<char[30]>有效,或者如何实现这一点?(固定大小数组的向量?
- 如何使用std::bind实现这一点