什么情况下更好?(涉及IT技术)

7

我有一个 MyClass 列表:

struct MyClass {
     bool is_old_result(int lifetime);
};
std::list<MyClass> results;
int lifetime = 50; // or something else

如何更好地进行删除操作(C++设计与性能):

results.remove_if(
    std::bind2nd(std::mem_fun_ref(&MyClass::is_old_result), lifetime));

或者

results.remove_if(boost::bind(&MyClass::is_old_result, _1, lifetime));

或者
struct RemoveFunctor {
   RemoveFunctor (int lifetime) : lifetime(lifetime) {}
   bool operator()(const MyClass & m) { return m.is_old_result(lifetime); }
private:
   int lifetime;
};
results.remove_if(RemoveFunctor(lifetime));

为什么?
附注:请不要使用lambda函数和C++0x。
2个回答

12

在设计方面,使用bind的方式肯定是最清晰的(其次是显式函数对象)。为什么呢?简洁明了。

在性能方面,函数对象应该是无与伦比的(一切都可以轻松分析和内联)。根据编译器的优化方式,使用bind的方式可能会匹敌它(对is_old_result的调用可能是直接的或者通过指针,这取决于编译器的分析)。


我也同意,bind 语法是最容易阅读的。如果性能不是首要问题,那么在这里选择 bind。 - Nick Haddad
3
我也同意,并且我会补充说,除非/直到你进行了分析并确定这个语句是一个性能瓶颈,否则性能应该是次要关注点。 - Fred Larson
boost::bind方法还可以很容易地过渡到C++0x,如果提问者有这样的愿望的话。(我知道提问者说不要C++0x,但我认为这仍然是一个有效的观点。) - fow

3

如果使用更合适的命名,比如“IsOldResult”或“ResultOlderThan”,我认为最终的解决方案将是最易读的,因为它最像散文:

results.remove_if(ResultOlderThan(lifetime));

然而,如果所代表的算法在多个上下文中出现,我可能只会编写函数对象。对于一个单行调用位置物理上分离出来的5行类,我认为这样做过于浪费。

否则,boost::bind 选项是我最喜欢的选项,因为它与 std::bind2nd(_1) 和std::mem_fun_ref (分别)之间有最少的额外内容。此外,boost::bind 在一般情况下适用于更多情况,例如不仅绑定函数的两个参数之一的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接