2011-05-25 48 views
1

“纯”谓词我的意思是他们只有取决于他们的论点。因此,下面的函数对象是一个有效的谓语,用于说,std :: sortSTL谓词是否必须是纯谓词?

// A predicate for sorting objects of type T2 that relies on an 
// object of type T1. 
class APredicate { 
    T1 &someObj; 
    APredicate(T1 &someObject) : someObj(someObject) {}; 

    bool operator() (T2 thing1, T2 thing2) { 
     return someObj.someFn(thing1) < someobj.someFn(thing2); 
    } 
} 

这是否有效?总是有效的?还是它取决于someObj.SomeFn()实际上做了什么?

+0

可能重复[std :: set'有什么问题?](http://stackoverflow.com/questions/5397616/what-is-wrong-with-stdset) – Nawaz 2011-05-25 05:49:50

+0

是的。请参阅可能的重复答案:[std :: set'有什么问题?](http://stackoverflow.com/questions/5397616/what-is-wrong-with-stdset) – Nawaz 2011-05-25 05:50:59

+0

是的。你可以在我之前的评论中提供的链接中阅读。 – Nawaz 2011-05-25 06:02:27

回答

2

“只依赖于它们的参数”实际上是指“如果再次调用相同的参数,必须返回与先前相同的结果”。如果您的someObj(的特定实例)没有改变它想要从someObj::someFn返回什么T2的特定实例,它“纯”。

只要条件成立的谓词(STL通过需要谓词,所以每个集合或操作有其自己的实例)的具体实例的寿命,这是正确的(显然它必须满足任何其他特定集合或算法的要求)。

+0

该实现是否依赖于?或者STL保证按价值判断谓词? – 2011-05-25 06:47:09

+0

@Nigel:有保证。看看在例如声明的原型http://www.sgi.com/tech/stl/transform.html。 – 2011-05-25 07:50:32

1

是的,没关系。

只要确保整个操作提供排序所需的任何稳定性要求即可。