James Kanze
10/2/2008 8:09:00 AM
On Oct 2, 2:44 am, Johannes Bauer <dfnsonfsdu...@gmx.de> wrote:
> I've been trying around with a simple std::map<mytype,
> unsigned> for an hour now and can't find the bug. It is my
> belief that I am missing something incredibly obvious...
> please help me see it.
> Scenario: I created the map and inserted some elements.
> Afterwards I try to iterate over them:
> std::map<mytype, unsigned int> values;
> /* insert some values, say 5 */
> /* this will then report 5 */
> std::cerr << "cnt = " << values.size() << std::endl;
> for (std::map<mytype, unsigned int>::iterator j = values.begin(); j !=
> values.end(); j++) {
> std::cerr << j->second << " -> ";
> j->first.Dump();
> std::cerr << std::endl;
> }
> However in the "for" loop, always only 2 items show up. I
> figured something was wrong with my operator< - essentialy
> "mytype" is just a container around a LENGTH byte unsigned
> char[] array:
> bool operator<(const mytype &Other) const {
> for (unsigned int i = 0; i < LENGTH; i++) {
> if (Other.Data[i] < Data[i]) return true;
> }
> return false;
> }
> Can anyone explain this behaviour?
Your comparison operator is obviously wrong. If we suppose Data
is an int[3], then what happens if you compare { 1, 2, 3 } and
{ 2, 1, 3 }. Regardless of the order, you're function returns
true, i.e. given
Data a = { 1, 2, 3 } ;
Data b = { 2, 1, 3 } ;
your function returns true for both a<b and b<a. One of the
requirements is that if a<b, then !(b<a). What you probably
want is something more like:
for ( int i = 0 ;
i != LENGTH && data[ i ] == other.data[ i ] ;
++ i ) {
}
return i != LENGTH
&& data[ i ] < other.data[ i ] ;
(In this case, your result depends entirely on the first
non-equal element, and if false if all elements are equal.)
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34