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

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Herby

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

    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()(Conf igKey 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???


  • Obnoxious User

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

    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()(Conf igKey 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()(Conf igKey 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.

    Comment

    • Herby

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

      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()(Conf igKey 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()(Conf igKey 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!!!!!

      Comment

      Working...