Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用智能指针创建哈希表?_C++_Vector_Hashtable_Smart Pointers - Fatal编程技术网

C++ 使用智能指针创建哈希表?

C++ 使用智能指针创建哈希表?,c++,vector,hashtable,smart-pointers,C++,Vector,Hashtable,Smart Pointers,我试图通过使用智能指针创建哈希表,但我不确定我是否做对了。我一直在尝试使用它们的两个组合,但我恐怕不知道如何将表初始化为空?也许这是错误的措辞,但我被卡住了,我需要被指向正确的方向 我的哈希节点: struct{ hashNode(int k, std::string i) : key(k), item(i){}; int key; std::string item; } 我的哈希表: class Hashtable { public: Hashtable(

我试图通过使用智能指针创建哈希表,但我不确定我是否做对了。我一直在尝试使用它们的两个组合,但我恐怕不知道如何将表初始化为空?也许这是错误的措辞,但我被卡住了,我需要被指向正确的方向

我的哈希节点:

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();//不确定如何构建构造函数构建空表。
int hashFunction(int键);
int-find(int-key);
无效插入(int键,std::string项);
无效删除(int键);
私人:
int tableSize=10;
std::共享_ptr哈希表;
//向量哈希表;
};

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

使用
std::unique\u ptr
hashNode
属性成员更改为单个指针。然后,在哈希表的构造函数中,您可以使用
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.
};
类哈希表{
公众:
哈希表();
int hashFunction(int键);
int-find(int-key);
无效插入(int键,std::string项);
无效删除(int键);
私人:
int tableSize=10;
std::unique_ptr hashTable;//如注释中所述。
};
在您的哈希表.cpp中

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

带有容器的哈希表示例

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 
};
类哈希表
{
公众:
Hashtable():Hashtable(10)//此处设置初始大小
{
//无所事事
}
int hashFunction(int键);
int-find(int-key);
void insert(int键,std::string项);//这会变得有点复杂
//由于在重新灰化期间复制
无效删除(int键);
私人:
std::vector哈希表;//vector知道它的大小
};

这稍微使重新灰化变得复杂,因为现在您必须复制而不是四处移动指针,但从好处看,复制包含
唯一\u ptr
的内容时,内存管理没有问题或困难。如果你复制它,它就不是唯一的了,是吗

std::shared\u ptr
您当然不希望这样。小心使用共享指针。除非您确实拥有一个拥有多个所有者的对象,否则它们很少是您想要的。如果只有一个用户负责删除指针,那么您需要一个
std::unique_ptr
。好的,假设我正在尝试复制
hashNode**hashtable
,就像我在其他示例中看到的那样。这不是一回事吗?我想这就是我感到困惑的地方。实现向量是否更正确@如果你做得对,就根本不需要指针。您需要的只是向量的向量(
std::vector
)。@Sailanarmo unique指针更好,但在指向数组时有不同的语法。共享指针不支持数组。参考文档。我想我需要在文档中进一步查看,因为我已经得到了智能指针的简短介绍,并且只在树中使用过它们。但是这两者之间有什么区别呢?
make_unique
如果tableSize不是一个常量,那么它不应该是合法的。@immibis,如果它只会生成大小为10的初始表,我应该将其设置为常量吗?当它满了一半时,我会重新灰化它,所以为了重新灰化,我将它作为一个非常量保留。但是,当我创建一个新表时,表大小将更改为20。那么这不是一个问题吗?有两点:1)如果数组的大小是固定的,为什么还要动态分配呢?2)考虑使用成员初始化器列表。如果您要做的第一件事是给它赋值,那么将
unique_ptr
初始化为null可以节省几个周期。确定。第一点从名单上删除了。