对容器中所有元素的成员函数结果求和的最佳方法是什么?
假设我有以下对象:
struct Foo
{
int size() { return 2; }
};
获取 vector
中所有对象的总 size
的最佳方法(最可维护、可读等)是什么?我会发布我的解决方案,但我对更好的想法感兴趣。
更新:
到目前为止,我们有:
- std::accumulate 和函子
- std::accumulate 和 lambda 表达式
- 普通 ol' for 循环
还有其他可行的解决方案吗?您可以使用 boost::bind
或 std::bind1st/2nd
使某些内容可维护吗?
Let's say I have the following object:
struct Foo
{
int size() { return 2; }
};
What's the best way (most maintainable, readable, etc.) to get the total size
of all objects in a vector<Foo>
? I'll post my solution but I'm interested in better ideas.
Update:
So far we have:
- std::accumulate and a functor
- std::accumulate and a lambda expression
- plain ol' for-loop
Are there any other workable solutions? Can you make something maintainable using boost::bind
or std::bind1st/2nd
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
除了您自己的建议之外,如果您的编译器支持 C++0x lambda 表达式,您可以使用这个较短的版本:
In addition to your own suggestion, if your compiler supports C++0x lambda expressions, you can use this shorter version:
使用 std::accumulate 和函子。
Use std::accumulate and a functor.
我发现 Boost 迭代器很优雅,尽管它们可能有点冗长(基于范围的算法会让这更好)。在这种情况下 转换迭代器 可以执行以下操作:作业:
编辑:将“
boost::bind(&Foo::size,_1)
”替换为“std::mem_fn(&Foo::size)
”编辑:我刚刚发现 Boost.Range 库已更新以引入范围算法!这是同一解决方案的新版本:
注意:性能大致相同(请参阅我的评论):在内部,
transformed
使用transorm_iterator
。I find Boost iterators elegants, although they can be a bit verbose (range-based algorithms would make this better). In this case transform iterators can do the job:
Edit: replaced "
boost::bind(&Foo::size,_1)
" by "std::mem_fn(&Foo::size)
"Edit: I just found that the Boost.Range library has been updated to introduce range algorithms! Here is a new version of the same solution:
Note: the performances are approximately the same (see my comment): internally,
transformed
usestransorm_iterator
.使用 C++11(及更高版本)基于范围的 for 循环
using C++11 (and beyond) range-based for loop
这是实际的解决方案:
Here is the down-to-earth solution: