R
Rune Allnor
Hi all.
I am a bit confused about std::set<> and associated predicates.
I have a std::set in my application where the predicate works
as expected when tested in isolation, but where the items inserted
in the set don't match the predicate, that is, the test
class predicate : public std::less {/*...*/};
predicate p;
std::set<size_t> s(p);
// Insert elements
std::set<size_t>::iterator i = s.begin();
std::set<size_t>::iterator j = i; j++;
bool b = p(*i,*j); // Should be true
results in b == false. The only reason I can think of why this
can happen is that std::set<size_t> actually uses some other
predicate to order its elements than I want it to do.
When I look up predicates in Josuttis' book on the C++ Standard
Library,
I find a rather naive predicate *function* defined on page 124.
When I look up in Stroustrup's The C++ Programming Language,
I fond a function *object* that inherits with template parameters
from
one of the predicates defined in header <functional>.
I suspect this might be the problem, that the way I let the predicate
class inherit from std::less<> is flawed.
But I can't find any descriptions of the template arguments.
Are there any obvious pitfalls I have missed here? What are the
differences between predicate _functions_ and _function_objects_?
For some reason I couldn't get std::set<> to accept the object
function unless the class inherited from std::less.
Could somebody please provide links to useful information on the
template arguments for std::less<>?
Thanks in advance,
Rune
I am a bit confused about std::set<> and associated predicates.
I have a std::set in my application where the predicate works
as expected when tested in isolation, but where the items inserted
in the set don't match the predicate, that is, the test
class predicate : public std::less {/*...*/};
predicate p;
std::set<size_t> s(p);
// Insert elements
std::set<size_t>::iterator i = s.begin();
std::set<size_t>::iterator j = i; j++;
bool b = p(*i,*j); // Should be true
results in b == false. The only reason I can think of why this
can happen is that std::set<size_t> actually uses some other
predicate to order its elements than I want it to do.
When I look up predicates in Josuttis' book on the C++ Standard
Library,
I find a rather naive predicate *function* defined on page 124.
When I look up in Stroustrup's The C++ Programming Language,
I fond a function *object* that inherits with template parameters
from
one of the predicates defined in header <functional>.
I suspect this might be the problem, that the way I let the predicate
class inherit from std::less<> is flawed.
But I can't find any descriptions of the template arguments.
Are there any obvious pitfalls I have missed here? What are the
differences between predicate _functions_ and _function_objects_?
For some reason I couldn't get std::set<> to accept the object
function unless the class inherited from std::less.
Could somebody please provide links to useful information on the
template arguments for std::less<>?
Thanks in advance,
Rune