Velocity Reviews > C++ > STL map problem

# STL map problem

arkandor
Guest
Posts: n/a

 06-24-2008
Hello,

I have following code. I wrote it in Borland C++ Builder 5.0.

#include <map>
#include <iostream>

using namespace std;

struct TVec
{
double x, y, z;
bool operator !=(const TVec& v2) const
{ return ((fabs(x-v2.x)>1e-12) || (fabs(y-v2.y)>1e-12) ||
(fabs(z-v2.z)>1e-12));}
};

typedef map<TVec, int, not_equal_to<TVec> > TMap;

int main()
{
TMap m;
TMap::iterator iter;

TVec v;

v.x=3.1; v.y=2.3; v.z=4.1;
m[v] = 32;
v.x=-3.1; v.y=2.3; v.z=4.1;
m[v]=45;
v.x=-3.25; v.y=2.3; v.z=4.1;
m[v] = 55;

cout<<"size = "<<m.size()<<endl;

v.x=3.1; v.y=2.3; v.z=4.1;
iter = m.find(v);
if (iter != m.end())
cout<<iter->second<<endl;

v.x=-3.1; v.y=2.3; v.z=4.1;
iter = m.find(v);
if (iter != m.end())
cout<<iter->second<<endl;

v.x=-3.25; v.y=2.3; v.z=4.1;
iter = m.find(v);
if (iter != m.end())
cout<<iter->second<<endl;

system("pause");
return 0;
}

After compilation we have on the screen :
size=3
32
45

However third element exsists in the map it isn't found by m.find(TVec)
(!!!)
I would be grateful for any suggestions.
Best regards, arkandor

huili80@gmail.com
Guest
Posts: n/a

 06-24-2008
On Jun 24, 7:01*am, "arkandor" <(E-Mail Removed)> wrote:
> Hello,
>
> I have following code. I wrote it in Borland C++ Builder 5.0.
>
> #include <map>
> #include <iostream>
>
> using namespace std;
>
> struct TVec
> *{
> * *double x, y, z;
> * *bool operator !=(const TVec& v2) const
> * *{ return ((fabs(x-v2.x)>1e-12) || (fabs(y-v2.y)>1e-12) ||
> (fabs(z-v2.z)>1e-12));}
> *};
>
> typedef map<TVec, int, not_equal_to<TVec> > TMap;
>
> int main()
> {
> *TMap m;
> *TMap::iterator iter;
>
> *TVec v;
>
> *v.x=3.1; v.y=2.3; v.z=4.1;
> *m[v] = 32;
> *v.x=-3.1; v.y=2.3; v.z=4.1;
> *m[v]=45;
> *v.x=-3.25; v.y=2.3; v.z=4.1;
> *m[v] = 55;
>
> *cout<<"size = "<<m.size()<<endl;
>
> *v.x=3.1; v.y=2.3; v.z=4.1;
> *iter = m.find(v);
> *if (iter != m.end())
> * cout<<iter->second<<endl;
>
> *v.x=-3.1; v.y=2.3; v.z=4.1;
> *iter = m.find(v);
> *if (iter != m.end())
> * cout<<iter->second<<endl;
>
> *v.x=-3.25; v.y=2.3; v.z=4.1;
> *iter = m.find(v);
> *if (iter != m.end())
> * cout<<iter->second<<endl;
>
> *system("pause");
> *return 0;
>
> }
>
> After compilation we have on the screen :
> size=3
> 32
> 45
>
> However third element exsists in the map it isn't found by m.find(TVec)
> (!!!)
> I would be grateful for any suggestions.
> Best regards, arkandor

So you use the not_equal_to<TVec> as the less_than compare for the
std::map, right?
which means whenever you have v1<v2, you also have v2<v1, where "<" is
what your map uses as a less_than compare ...
It doesn't suprise me all that you got non-sense result, because your
less_than compare doesn't make much sense.

James Kanze
Guest
Posts: n/a

 06-24-2008
On Jun 24, 1:01 pm, "arkandor" <(E-Mail Removed)> wrote:

> I have following code. I wrote it in Borland C++ Builder 5.0.

> #include <map>
> #include <iostream>

> using namespace std;

> struct TVec
> {
> double x, y, z;
> bool operator !=(const TVec& v2) const
> { return ((fabs(x-v2.x)>1e-12) || (fabs(y-v2.y)>1e-12) ||
> (fabs(z-v2.z)>1e-12));}
> };

> typedef map<TVec, int, not_equal_to<TVec> > TMap;

std::map requires an ordering relationship, not an equivalence
relationship. (Not that you've implemented either; your
definition of != doesn't establish an equivalence relationship
either.)

From that point on, behavior is undefined.

--
James Kanze (GABI Software) email:(E-Mail Removed)
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

arkandor
Guest
Posts: n/a

 06-26-2008
So you use the not_equal_to<TVec> as the less_than compare for the
std::map, right?
which means whenever you have v1<v2, you also have v2<v1, where "<" is
what your map uses as a less_than compare ...
It doesn't suprise me all that you got non-sense result, because your
less_than compare doesn't make much sense.

I've already solved this "problem". When I properly defined < operator
everything works fine. Thanks anyway.

arkandor