在这个简单的哈希实现中做了什么?

时间:2011-10-18 18:25:01

标签: c++

我知道*定义了一个指针...... **定义指向指针的指针吗?

如果是这样,为什么?

指针指针有时被称为引用吗?只需要澄清以下非常简单的哈希。

通常指针用于传递较大结构的位置,因为整个内容过于昂贵。

我已经看到指向quantlib项目中用于创建“句柄”的指针的指针,因为每个“观察者”都持有一个指向“术语结构”指针的指针,该指针可能在运行时发生变化,因此指针保持位置另一个指针。

但是我在这里看不到相关性?

class hash_entry 
{
private:
    int key;
    int value;
public:
    hash_entry(int key, int value) 
    {
        this->key = key;
        this->value = value;
    }
    int getKey() 
    {
        return key;
    }
    int getValue() 
    {
        return value;
    }
};

class hash_map 
{
private:
    hash_entry **table;
    static const int TABLE_SIZE = 128;
public:
    hash_map() 
    {
        table = new hash_entry*[TABLE_SIZE];
        for (int i = 0; i < TABLE_SIZE; i++)
            table[i] = NULL;
    }
    int get(int key) 
    {
        int hash = (key % TABLE_SIZE);
        while (table[hash] != NULL && table[hash]->getKey() != key)
            hash = (hash + 1) % TABLE_SIZE;
        if (table[hash] == NULL)
            return -1;
        else
            return table[hash]->getValue();
    }
    void put(int key, int value) 
    {
        int hash = (key % TABLE_SIZE);
        while (table[hash] != NULL && table[hash]->getKey() != key)
            hash = (hash + 1) % TABLE_SIZE;
        if (table[hash] != NULL)
            delete table[hash];
        table[hash] = new hash_entry(key, value);
    }
    ~hash_map() 
    {
        for (int i = 0; i < TABLE_SIZE; i++)
            if (table[i] != NULL)
                delete table[i];
        delete[] table;
    }
};

5 个答案:

答案 0 :(得分:5)

是的,**定义了指向指针的指针(因为规范是这样说的)。不,我无法想象有人称这是一个参考。

至于为什么他们在这种情况下使用它,他们正在编写(非常类似C)代码来动态分配指向X的指针数组。这段代码:

 hash_entry **table;

 [ ... ]

 hash_map() {
    table = new hash_entry*[TABLE_SIZE];

大致等同于:

std::vector<hash_entry *> table(TABLE_SIZE);

(虽然目前,我还没有把它拆开,因为你需要一个班级成员)。

答案 1 :(得分:3)

是的,**是指向指针的指针,但不是,这与引用不同。在此上下文中,它用于创建动态分配的hash_entry二维数组。

顺便问一下,你确定这段代码编译了吗?我看到一些似乎是语法错误的东西。

答案 2 :(得分:2)

你是正确的**是指向指针的指针(虽然不正确,这是一个引用 - 引用用例如&int & foo表示。)

在这种情况下,它的使用方式不是你所描述的(作为“句柄”),而是作为指向hash_entry的指针数组

该行:

table = new hash_entry*[TABLE_SIZE];

表示“分配一块内存来保存hash_entry指针,大小为TABLE_SIZE * sizeof(hash_entry*)。从那里,数组被初始化为NULL,之后你可以填充每个条目根据需要使用指针的数组。

答案 3 :(得分:0)

是的,**表示指向指针的指针。

添加额外级别的间接的一个原因是,您可以将最终指向的内容移动到物理内存中,而不会将代码指向需要直接通知新地址的something

如果内存管理器想要在内存中移动某些内容(例如,减少堆中的漏洞),它可以分配新内存,移动对象,并更新指针指针指向的地址以指向该内存新地址。

特别是在这种情况下,如果您的哈希条目多于TABLE_SIZE,则代码可以使用更大的内存块重新分配hash_entry,并使用新地址{{更新table 1}}。其余的代码可能对重新分配无知。

答案 4 :(得分:0)

  

我知道*定义一个指针......确定**定义一个指向指针的指针吗?

  

若是,为什么?

我假设你的意思是为什么有人会使用一个,而不是类型如何工作(参见任何c参考)。我看过几个地方并使用过它们:

  1. 动态指针数组。 (这就是我们在这里所拥有的)
  2. 动态二维数组。 (这实际上是1的子集,一个动态数组,其中每个元素指向另一个动态数组)
  3. 通过以arg(*arg = ptr_to_return)传递的指针“返回”指针。见,例如, getline()
  4.   

    指针指针有时被称为引用吗?只需要澄清以下非常简单的哈希。

    不,引用本质上是通过引用传递,但让编译器为你跟踪指针。

      

    通常指针用于传递较大结构的位置,因为整个内容过于昂贵。

    是的,但不是唯一的。考虑一个更改结构成员的方法。您需要它来更改结构的副本,而不是通过值传递时的本地副本。

    在此处的示例中,hash_entry **table;被用作指向hash_entry的(动态大小)指针数组。它可能更明确地被宣布为hash_entry *table[];

相关问题