Re: std::set<> and predicates
Rune Allnor wrote:
[..]
So I guess I have two alternative questions:
1) How to use std::set<> with a predicate that is not part
of the type declaration?
There is no way. Internally, when the set is constructed, it will
disregard the predicate you give it if it is not of the type specified.
Try not deriving your predicate from 'std::less' and you're going to
see why.
Why do you need to derive? By doing that you just mask the problem.
The 'operator()' is not a virtual function. What happens is that your
predicate is converted to 'std::less' and 'std::less::operator()' is
used for comparison, and not your implementation.
So, remove the base class from your predicate, and make it work.
2) How to use std::set<size_t,predicate> where the only
accessible ctor of the predicate takes arguments?
I don't understand what the problem is.
#include <iostream>
#include <set>
class predicate
{
double d;
public:
predicate(double d_) : d(d_) {}
// Is this the correct function signatiure?
bool operator()(const size_t& a, const size_t& b)
{
return a > b; // Make sure the result is different
// with this prediacate compared to the
// default std::less<size_t> predicate
}
};
typedef std::set<size_t,predicate> myset;
int main()
{
predicate p(3.1415926);
myset s(p);
s.insert(20);
s.insert(10);
myset::iterator i = s.begin();
myset::iterator j = i;
j++;
std::cout << "*i == " << *i << std::endl;
std::cout << "*j == " << *j << std::endl;
if(p(*i,*j)) {
std::cout << "true" << std::endl;
} else {
std::cout << "false" << std::endl;
}
return 0;
}
Output:
*i == 20
*j == 10
true
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask