Re: comparison operator for STL sets
srp113 wrote:
Hello,
The comparator functor one specifies when declaring a stl set should
follow strict weak ordering semantics. This means it should return
true if x is strictly less than y, otherwise false. And equivalance is
tested as x == y iff. !(x < y) and ! (y < x). If this is met then
set.insert() will fail since there is such an element already. What
about the case where it turns out (x < y) and ( y < x) is true,
Then the operator does not provide a strict weak ordering. The behavior
is undefined.
should such an element be inserted? Logically this should never
happen, but I ran into this in code below:
struct MyClass {
MyClass(int num,char *name): _num(num){
strlcpy(_name,name,sizeof _name);
}
int _num;
char _name[NAME_LEN+1];
};
class MyClassCompare{
public:
bool operator()(const MyClass& lhs,const MyClass& rhs) const{
if(lhs._num < rhs._num)
return true;
else {
if(strncmp(lhs._name,rhs._name,NAME_LEN+1) < 0)
return true;
}
return false;
}
The predicate is wrong.
if (lhs._num < rhs._num)
return true;
else if (rhs._num == lsh._num
&& strncmp(lhs._name, rhs._name, NAME_LEN_1) < 0)
return true;
else return false;
--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of
"The Standard C++ Library Extensions: a Tutorial and Reference"
(www.petebecker.com/tr1book)