2013-03-11 9 views
8

bunun gibi site var sınıf şablonu Ancak, hiçbir örnek yoktur ve eğer bu mümkün olursa, bu özelliği çalışmaya başlamamıştım. Çalışma dışı örnek:fonksiyon işaretçileri :: unordered_map

demek
bool unordered_eq(const char* const s1, const char* const s2) 
{ 
    return !std::strcmp(s1, s2); 
} 

std::size_t unordered_hash(char const* s) 
{ 
    return std::hash<std::string>()(s); 
} 

std::unordered_map<char const*, std::string, 
    unordered_hash, unordered_eq> hashmap; 
+1

Dizeleri anahtar olarak kullanmak isterseniz, neden 'std :: string' kullanılmıyor? Dize değişmezleriyle de çalışır. –

+0

Sadece bir örnek, 'Anahtar' herhangi bir şey olabilir. Yine de aradaki cevabı biliyorum, biri 'decltype (& unordered_hash)' ve 'decltype (& unordered_eq)' 'Hash' ve' Pred' olarak kullanabilir. Site haklı. – user1095108

cevap

10

bir yerine bir sınıf

No, bir işlev işaretçisi sağlayabilir, bu bir yanlış anlama. nesnesi nesnesi yerine yapıcı yapıcısına bir işlev gösterici sağlayabilirsiniz. Şablon parametresi hala bir tür - bu durumda bir işlev işaretçisinin türü. Yani, Sizin standart kütüphane ilk parametre için varsayılan değerini tanımlar ancak bu varsayılan değer standart değil

typedef unordered_map< 
      char const*, string, 
      size_t(*)(char const*), // type for hashing 
      bool(*)(char const*, char const*) // type for equality 
     > yourmaptype; 

yourmaptype hm (
     4, // minimum number of buckets 
     &unordered_hash, // function address for hashing 
     &unordered_eq, // function address for equality 
    ); 

yazmak zorunda. Satıcıya özgü varsayılan değerini n için tutmanın ve aynı zamanda functor'ların değerlerini ayarlamanın bir yolu yok gibi görünüyor. 4 kullanımım burada oldukça keyfi.

Bunun yerine, varsayılan yapılandırılabilir işlev nesnelerini kullanmayı düşünmelisiniz. Sadece bu minimim kova boyutunu belirlemeden kurtulmak için izin verecek, aynı zamanda daha hızlı olacaktır, çünkü funlator çok derleyici için inline daha kolay.

+0

Sadece kayıt için, 'gcc' 'n' için varsayılan değeri kullanır. – user1095108