comparison operator for STL sets
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,
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;
}
};
int main(int argc,char* argv[]) {
typedef std::set<MyClass,MyClassCompare> MyClassSet;
typedef MyClassSet::iterator MyClassSetItr;
MyClassSet mcSet;
MyClass mc1(10,"Hello"),mc2(10,"Hellm"),mc3(10,"Hellp"),mc4
(20,"Hello"),mc5(10,"Hello");
pair<MyClassSetItr,bool> retVal;
retVal = mcSet.insert(mc1);
cout << "Return code from inserting mc1=" << retVal.second << endl;
retVal = mcSet.insert(mc2);
cout << "Return code from inserting mc2=" << retVal.second << endl;
retVal = mcSet.insert(mc3);
cout << "Return code from inserting mc3=" << retVal.second << endl;
retVal = mcSet.insert(mc4);
cout << "Return code from inserting mc4=" << retVal.second << endl;
retVal = mcSet.insert(mc5);
cout << "Return code from inserting mc5=" << retVal.second << endl;
for(MyClassSetItr itr=mcSet.begin();itr != mcSet.end();itr++) {
cout << " " << (*itr)._num << "," << (*itr)._name << endl;
}
}
the output from this code was:
Return code from inserting mc1=1
Return code from inserting mc2=1
Return code from inserting mc3=1
Return code from inserting mc4=1
Return code from inserting mc5=0
Printing the set:
10,Hellm
10,Hello
20,Hello
10,Hellp
should object(20,Hello) have been allowed to be inserted into set?
Why is that element not at end of the list when I am displaying the
set? I see that when comparing object(20,Hello) with object(10,Hellp)
operator < will return true for both x<y and y<x. Is there something
wrong with the way I have setup the comparator here? It would be more
straightforward if set allowed === in which I can unambiguously test
for equivalance of two MyClass objects...
Thanks Much for your help,
Sunil