'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++
C++
cevap
Ç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.
Boost'un unordered sınıflarını deneyin.
boost.unordered ve data structure'a bakın.
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;
}
genel tür anahtar-değer çiftleri ve ayrı zincirleme stratejisi ile temel bir Hash Tablo dışarı Simple Hash Map (Hash Table) Implementation in C++ kontrol edin.
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. –
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