SORU
16 Kasım 2011, ÇARŞAMBA


Std uzmanlaşmak için nasıl::karma<Anahtar>::operator() kullanıcı tanımlı için sırasız kaplarda tür?

Destek kullanıcı tanımlı std::unordered_set<Key> *4 anahtar türleri* operator==(Key, Key) ve karma bir functor sağlamak için vardır:

struct X { int id; /* ... */ };
bool operator==(X a, X b) { return a.id == b.id; }

struct MyHash {
  size_t operator()(const X& x) const { return std::hash<int>()(x.id); }
};

std::unordered_set<X, MyHash> s;

Sadece std::unordered_set<X>yaz için daha uygun olacaktır bir ilevarsayılan karmaX yazın türleri derleyici ve kütüphane ile birlikte geliyor. Danıştıktan sonra

  • C Standart Draft N3242 §20.8.12 [unord.karma] ve §17.6.3.4 [karma.şartları],
  • Boost.Unordered
  • g include\c \4.7.0\bits\functional_hash.h
  • VC10 include\xfunctional
  • Yığın Taşması related questionçeşitli

mümkün std::hash<X>::operator() uzmanlaşmak gibi görünüyor:

namespace std { // argh!
  template <>
  inline size_t 
  hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } // works for MS VC10, but not for g  
  // or
  // hash<X>::operator()(X x) const { return hash<int>()(x.id); }     // works for g   4.7, but not for VC10 
}                                                                             

C 11 desteği henüz deneysel---ben derleyici Çınlama - - - bu deneyin vermedi bana verilen sorular:

  1. std ad için böyle bir uzmanlık eklemek yasal mı? Bu konuda karışık duygular var.

  2. Olan varsa std::hash<X>::operator() sürümleri, C 11 standart ile uyumludur?

  3. Taşınabilir bir yol var mı?

CEVAP
16 Kasım 2011, ÇARŞAMBA


Açıkça izin verilen ve eklemek için teşvik ediliruzmanlıkstd* ad. (Ve temelde sadece hash) fonksiyonu eklemek için doğru yolu şudur:

namespace std {
  template <> struct hash<Foo>
  {
    size_t operator()(const Foo & x) const
    {
      /* your code here, e.g. "return hash<int>()(x.value);" */
    }
  };
}

Destekleyici düşünebilirsiniz (diğer popüler uzmanlıklar std::less, std::equal_to*. *19)

*) dahil türlerinden biri olarak kullanıcı tanımlı sanırım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CNET

    CNET

    5 Mayıs 2006
  • Khan Academy

    Khan Academy

    17 Kasım 2006
  • NextKsa

    NextKsa

    7 EKİM 2009