C++中简单的hashmap实现

Simple hashmap implementation in C++

本文关键字:hashmap 实现 简单 C++      更新时间:2023-10-16

我对C++还比较陌生。在Java中,实例化和使用hashmap对我来说很容易。我想知道如何在C++中以简单的方式实现它,因为我看到了许多不同的实现,但对我来说没有一个看起来很简单。

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

如果您想将类用作值,而不是键,那么您不需要做任何特殊的操作。所有基元类型(如intcharbool甚至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;

在那之后一切都应该按预期进行。

在C++中使用哈希图很容易!这就像使用标准的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;
}

看看boost.unorordered及其数据结构。

试试boost的无序类。

查看C++中的简单哈希映射(Hash Table)实现,了解具有泛型类型键值对和单独链接策略的基本哈希表。