STL map problem

Discussion in 'C++' started by arkandor, Jun 24, 2008.

  1. arkandor

    arkandor Guest

    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
    arkandor, Jun 24, 2008
    #1
    1. Advertising

  2. arkandor

    Guest

    On Jun 24, 7:01 am, "arkandor" <> 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.
    , Jun 24, 2008
    #2
    1. Advertising

  3. arkandor

    James Kanze Guest

    On Jun 24, 1:01 pm, "arkandor" <> 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:
    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
    James Kanze, Jun 24, 2008
    #3
  4. arkandor

    arkandor Guest

    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
    arkandor, Jun 26, 2008
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    9
    Views:
    581
  2. Marcus
    Replies:
    2
    Views:
    577
    Marcus
    Dec 9, 2005
  3. Replies:
    2
    Views:
    539
    klaus hoffmann
    Feb 22, 2006
  4. kl
    Replies:
    7
    Views:
    1,270
    James Kanze
    Jan 1, 2008
  5. Luca Risolia

    STL map to STL vector

    Luca Risolia, Jan 13, 2014, in forum: C++
    Replies:
    32
    Views:
    333
    Seungbeom Kim
    Jan 18, 2014
Loading...

Share This Page