Re: Map losing elements!?
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=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34