$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] [Unordered] template find() request
From: joaquin_at_[hidden]
Date: 2009-03-09 04:29:20
Daniel James escribió:
> 2009/3/9  <joaquin_at_[hidden]>:
>   
>> FWIW, Boost.MultiIndex hashed indices do have a notion of "compatible keys"
>> allowing for
>> such heterogeneous lookup operations:
>>
>> http://www.boost.org/libs/multi_index/doc/tutorial/indices.html#hash_lookup
>> http://www.boost.org/libs/multi_index/doc/reference/hash_indices.html#lookup
>>     
>
> In the equivalent to this case:
>
>     boost::unordered_set<std::string> set;
>
>     // ....
>
>     set.find("x");
>
> Is a std::string constructed for every hash and equality call? I can't
> see a way to avoid that without introducing a traits class.
>   
Translating the compatible key functionality of B.MI to the syntax of 
boost::unordered_set,
you'd have two ways of doing this:
#1
  struct custom_hash:boost::hash<std::string>
  {
    using boost::hash<std::string>::operator();
    std::size_t operator()(const char* x)const
    {
      return boost::hash_range(x,x+std::strlen(x));
    }
  };
  struct custom_equal_to:std::equal_to<std::string>
  {
    using std::equal_to<std::string>::operator();
    bool operator()(const std::string& x,const char* y)const
    {
      return x==y;
    }
    bool operator()(const char* x,const std::string& y)const
    {
      return x==y;
    }
  };
  //...
  boost::unordered_set<std::string,custom_hash,custom_equal_to> set;
  //...
  set.find("x");
#2
  struct custom_hash
  {
    std::size_t operator()(const char* x)const
    {
      return boost::hash_range(x,x+std::strlen(x));
    }
  };
  struct custom_equal_to
  {
    bool operator()(const std::string& x,const char* y)const
    {
      return x==y;
    }
    bool operator()(const char* x,const std::string& y)const
    {
      return x==y;
    }
  };
  //...
  boost::unordered_set<std::string> set;
  //...
  set.find("x",custom_hash(),custom_equal_to());
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo