STL map problem

A

arkandor

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
 
H

huili80

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.
 
J

James Kanze

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.
 
A

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.

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

arkandor
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,899
Latest member
RodneyMcAu

Latest Threads

Top