C++

2008-11-05 17 views
30

'da basit hashmap uygulaması C++ 'ya göreceli olarak yeniyim. Java'da, bir hashmap oluşturmam ve kullanmam benim için kolay. C++ 'da basit bir şekilde nasıl yapıldığını bilmek isterdim, çünkü birçok farklı uygulama gördüm ve bunların hiçbiri bana basit görünmedi.C++

cevap

26

Çoğu derleyici sizin için std::hash_map tanımlamalıdır; Gelecek C++0x standardında, standart kitaplığın bir parçası olacak std::unordered_map. Üzerinde STL Page oldukça standarttır. Visual Studio'yu kullanırsanız, Microsoft'un bir sayfası vardır.

Sınıfınızı anahtar olarak değil de değer olarak kullanmak istiyorsanız, özel bir şey yapmanız gerekmez. Tüm ilkel türler (int, char, bool ve hatta char * gibi) hash_map numaralı anahtarlarda "yalnızca" çalışmalıdır. Ancak, başka bir şey için kendi karma ve eşitlik işlevlerinizi tanımlamanız ve daha sonra bunları bir sınıfa sarmak için "functor" yazmanız gerekir.

sınıf MyClass denir varsayarsak ve zaten tanımlamış:

size_t MyClass::HashValue() const { /* something */ } 
bool MyClass::Equals(const MyClass& other) const { /* something */ } 

nesnelere özgü çalışmalara sarmak için iki Functors tanımlamak gerekir.

struct MyClassHash { 
    size_t operator()(const MyClass& p) const { 
    return p.HashValue(); 
    } 
}; 

struct MyClassEqual { 
    bool operator()(const MyClass& c1, const MyClass& c2) const { 
    return c1.Equals(c2); 
    } 
}; 

Ve hash_map/hash_set olarak örneğini: bundan sonra beklendiği gibi

hash_map<MyClass, DataType, MyClassHash, MyClassEqual> my_hash_map; 
hash_set<MyClass, MyClassHash, MyClassEqual> my_hash_set; 

Her şey çalışmalıdır.

+0

Unix'i kullandığımı söylemeyi unuttum. Kodladığınız örnek çok basit görünüyor, deneyeceğim. Ama HashValue() yöntemini kendim yaratmalıyım, değil mi? Java'nın Object sınıfı için bir varsayılan hashcode() yöntemi olduğundan, bunun C++'da nasıl çalıştığını bilmiyorum. –

+0

Cevaba daha fazla açıklama ekledim. Ayrıca, destek malzemesi de tavsiye edilmiştir - bu, anarşidir, ancak (bazı kısımlar) öğrenme, yeni bir dil öğrenmeyi öğrenmek gibidir. unordered başlamak için kötü bir yer değil. – hazzen

16

C++ 'da hashmaps kullanımı kolaydır! Standart C++ haritasını kullanmak gibi. unordered_map'un derleyici/kütüphane uygulamasını kullanabilir ya da boost ya da başka bir satıcı tarafından verileni kullanabilirsiniz. İşte hızlı bir örnek. Verdiğiniz bağlantıları takip ederseniz daha fazlasını bulacaksınız.

#include <unordered_map> 
#include <string> 
#include <iostream> 

int main() 
{ 
    typedef std::tr1::unordered_map< std::string, int > hashmap; 
    hashmap numbers; 

    numbers["one"] = 1; 
    numbers["two"] = 2; 
    numbers["three"] = 3; 

    std::tr1::hash<std::string> hashfunc = numbers.hash_function(); 
    for(hashmap::const_iterator i = numbers.begin(), e = numbers.end() ; i != e ; ++i) { 
     std::cout << i->first << " -> " << i->second << " (hash = " << hashfunc(i->first) << ")" << std::endl; 
    } 
    return 0; 
}