2008-11-05 125 views
30

我对C++比较陌生。在Java中,我很容易实例化并使用hashmap。我想知道如何在C++中以简单的方式来完成它,因为我看到了很多不同的实现,而且它们都不那么简单。C++中简单的hashmap实现

回答

26

大多数编译器应该为你定义std::hash_map;在即将到来的C++0x标准中,它将作为std::unordered_map的标准库的一部分。其上的STL Page是相当标准的。如果您使用Visual Studio,Microsoft上有一个页面。

如果你想使用你的类作为值,而不是作为键,那么你不需要做任何特殊的事情。所有原始类型(例如int,char,bool乃至char *)应该“只是作为”hash_map中的键。但是,对于其他任何事情,您将不得不定义自己的哈希和平等函数,然后编写将它们包装到类中的“函子”。

假设你的类被称为MyClass,并且您已经定义为:

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

您需要定义两个函子来包装对象的方法。

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); 
    } 
}; 

和实例您hash_map/hash_set为:

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

一切都应该工作之后,随着预期。

+0

我忘了告诉我正在使用Unix。你编码的例子看起来很简单,我会试试看。但是我应该创建自己的HashValue()方法,对吧?因为Java有一个默认的Object类的hashcode()方法,所以我不知道它在C++中是如何工作的。 – 2008-11-05 19:53:29

16

在C++中使用hashmaps很简单!这就像使用标准的C++地图。您可以使用您的编译器/库实现unordered_map或使用boost或某个其他供应商提供的编译器/库实现。这是一个快速示例。你会发现更多,如果你按照你给的链接。

#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; 
}