Предикаты STL должны быть чистыми предикатами? - PullRequest
1 голос
/ 25 мая 2011

Под «чистыми» предикатами я подразумеваю, что они только зависят от своих аргументов. Так что следующий функциональный объект является допустимым предикатом для использования, скажем, в std :: sort

// 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 ()?

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

«зависит только от их аргументов» на самом деле означает «при повторном вызове с теми же аргументами должен возвращать тот же результат, что и ранее». Если ваш (конкретный экземпляр) someObj не изменяет свое мнение о том, что возвращать из someObj::someFn для конкретных экземпляров T2, то будет"чистым".

Пока условие выполняется для времени жизни конкретного экземпляра предиката (STL принимает предикаты по значению , поэтому у каждой коллекции или операции есть собственный экземпляр), это правильно (очевидно, что удовлетворить любые другие требования конкретной коллекции или алгоритма).

1 голос
/ 25 мая 2011

Да, все в порядке.

Просто убедитесь, что вся операция соответствует требованиям стабильности, необходимым для сортировки.

...