我发现 Boost 迭代器很优雅,尽管它们可能有点冗长(基于范围的算法会更好)。在这种情况下,转换迭代器可以完成这项工作:
#include <boost/iterator/transform_iterator.hpp>
//...
int totalSize = std::accumulate(
boost::make_transform_iterator(vf.begin(), std::mem_fn(&Foo::size)),
boost::make_transform_iterator(vf.end(), std::mem_fn(&Foo::size)),0);
编辑:将“ boost::bind(&Foo::size,_1)
”替换为“ std::mem_fn(&Foo::size)
”
编辑:我刚刚发现 Boost.Range 库已经更新以引入范围算法!这是同一解决方案的新版本:
#include <boost/range/distance.hpp> // numeric.hpp needs it (a bug?)
#include <boost/range/numeric.hpp> // accumulate
#include <boost/range/adaptor/transformed.hpp> // transformed
//...
int totalSize = boost::accumulate(
vf | boost::adaptors::transformed(std::mem_fn(Foo::size)), 0);
注意:性能大致相同(请参阅我的评论):在内部,transformed
使用transorm_iterator
.