使用智能指针制作哈希表?

时间:2017-04-02 21:10:40

标签: c++ vector hashtable smart-pointers

我正在尝试使用智能指针制作哈希表,但我不确定我是否做得对。我一直在尝试使用它们的两种组合,但我担心我不知道如何将表初始化为空?也许这是错误的问题,但我被困住了,我需要指出正确的方向。

我的hashNode:

struct{
    hashNode(int k, std::string i) : key(k), item(i){};

    int key;
    std::string item;
}

我的哈希表:

class Hashtable
{
public:

    Hashtable(); //not sure how to build the constructor build an empty table.

    int hashFunction(int key);
    int find(int key);
    void insert(int key, std::string item);
    void remove(int key);

private:

    int tableSize = 10;
    std::shared_ptr<std::shared_ptr<hashNode>> hashTable;
    //std::vector<std::shared_ptr<hashNode>> hashTable;
};

我被困在这里,因为我不知道我是否正确实现了hashTable。或者,如果这只是一个坏主意。任何建议都可以。

2 个答案:

答案 0 :(得分:1)

使用hashNodestd::unique_ptr属性成员更改为单个指针。然后,在HashTable的构造函数中,您可以使用std::make_unique对其进行初始化。

在你 HashTable.h

class Hashtable {
public:
   Hashtable(); 

   int hashFunction(int key);
   int find(int key);
   void insert(int key, std::string item);
   void remove(int key);

private:
   int tableSize = 10;
   std::unique_ptr<hashNode[]> hashTable;  // As stated in the comments.
};

HashTable.cpp

Hashtable::Hashtable() {
   hashTable = std::make_unique<hashNode[10]>();
}

答案 1 :(得分:0)

带容器的HashTable示例

class Hashtable
{
public:
    Hashtable(): hashTable(10) // initial size set here
    {
        // does nothing
    }
    int hashFunction(int key);
    int find(int key);
    void insert(int key, std::string item); // this gets a bit more complicated
                                            // due to copying during rehash
    void remove(int key);

private:
    std::vector<std::vector<hashNode>> hashTable; // vector knows its size 
};

这使得复制变得稍微复杂,因为现在你必须复制而不是移动指针,但是在上部存在零内存管理困境或复制包含unique_ptr的东西的困难。如果你复制它就不会是唯一的,不是吗?