How to write a multi value compare function for std::map

Discussion in 'C++' started by Herby, Nov 10, 2008.

  1. Herby

    Herby Guest

    Hi,

    My key for the map is a class with two strings, group and name as
    follows:

    class ConfigKey{
    public:

    ConfigKey( String group, String key );

    String mGroup;
    String mName;
    };


    Now I want to do a lookup on both values matching.

    So I have defined my own compare functions as follows:

    struct cmp_config_key
    {
    bool operator()(ConfigKey const *lhs, ConfigKey const *rhs)
    {
    if( lhs->mGroup < rhs->mGroup ){
    if( lhs->mKey < rhs->mKey )
    return true;
    }

    return false;

    }
    };

    Above is not working correctly as it returns some other key when i
    call find. Im not too clear on this weak ordering business and it
    gets even more confusing with multiple values acting as the key.

    Naturally and intuitively i just want to write

    if( lhs->mGroup == rhs->mGroup ){
    if( lhs->mKey == rhs->mKey )
    return true;
    }

    Please could someone correct my function???
     
    Herby, Nov 10, 2008
    #1
    1. Advertising

  2. Herby

    Herby Guest

    On Nov 10, 5:58 pm, Obnoxious User <O...@127.0.0.1> wrote:
    > On Mon, 10 Nov 2008 09:22:21 -0800, Herby wrote:
    > > Hi,

    >
    > > My key for the map is a class with two strings, group and name as
    > > follows:

    >
    > > class ConfigKey{
    > > public:

    >
    > > ConfigKey( String group, String key );

    >
    > > String mGroup;
    > > String mName;
    > > };

    >
    > > Now I want to do a lookup on both values matching.

    >
    > > So I have defined my own compare functions as follows:

    >
    > > struct cmp_config_key
    > > {
    > > bool operator()(ConfigKey const *lhs, ConfigKey const *rhs) {
    > > if( lhs->mGroup < rhs->mGroup ){
    > > if( lhs->mKey < rhs->mKey )
    > > return true;
    > > }

    >
    > > return false;

    >
    > > }
    > > };

    >
    > > Above is not working correctly as it returns some other key when i call
    > > find. Im not too clear on this weak ordering business and it gets even
    > > more confusing with multiple values acting as the key.

    >
    > > Naturally and intuitively i just want to write

    >
    > > if( lhs->mGroup == rhs->mGroup ){
    > > if( lhs->mKey == rhs->mKey )
    > > return true;
    > > }

    >
    > > Please could someone correct my function???

    >
    > struct cmp_config_key
    > {
    > bool operator()(ConfigKey const *lhs, ConfigKey const *rhs) const
    > {
    > if(lhs->mGroup < rhs->mGroup) {
    > return true;
    > }
    > if(lhs->mGroup == rhs->mGroup) {
    > if(lhs->mKey < rhs->mKey) {
    > return true;
    > }
    > }
    > return false;
    > }
    >
    > };
    >
    > --
    > OU
    > Remember 18th of June 2008, Democracy died that afternoon.http://frapedia.se/wiki/Information_in_English


    Thanks mate. Excellent works!!!!!
     
    Herby, Nov 10, 2008
    #2
    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. Peter Jansson
    Replies:
    5
    Views:
    6,398
    Ivan Vecerina
    Mar 17, 2005
  2. thinktwice
    Replies:
    5
    Views:
    506
    dasjotre
    Nov 15, 2006
  3. Replies:
    1
    Views:
    443
    red floyd
    Dec 21, 2008
  4. Thomas J. Gritzan
    Replies:
    6
    Views:
    1,040
    James Kanze
    Dec 22, 2008
  5. James Kanze
    Replies:
    0
    Views:
    2,051
    James Kanze
    Dec 21, 2008
Loading...

Share This Page