2009-12-28 205 views
4

所以我有這樣的事情全局變量

#define HASHSIZE 1010081 

static struct nlist *hashtab[HASHSIZE]; 

現在我希望能夠改變我hashtab的HASHSIZE,因爲我想測試不同的素數數,看看哪會少給我的碰撞。但是數組並不需要可變大小,所以HASHSIZE必須是一個常數。有沒有辦法去解決這個問題?

+0

我們需要更多信息。你是否試圖隨時調整散列表的大小?你可以使用'std :: vector'而不是本地數組,但是在重新調整大小時,你必須重新提取表中已經存在的所有內容。 – 2009-12-28 16:49:35

+0

re-bucket ??????????? – SuperString 2009-12-28 19:33:05

+1

@SuperString Adrian意味着如果你在分配它之後改變了一個向量的大小,你將不得不重新計算每個元素所在的桶。我認爲你並沒有要求調整現有的哈希表,但我認爲你只是詢問如何創建不同大小的哈希表。 – 2009-12-28 23:48:46

回答

10

爲什麼不使用std::vector而不是在C++中使用數組?

如:

std::vector<nlist *> hashtab; 
    hashtab.resize(<some_value>); 

但不管怎麼說,你可以,如果你使用的是g++因爲g++支持可變長度的數組(VLA)作爲擴展做到這一點。

例如:

int HASHSIZE=<some_value> 
    static struct nlist *hashtab[HASHSIZE]; 
0

爲什麼你不使用常量?

const int HASHSIZE = 1010081; 

常量是提供給編譯器作爲一個文字值,因此它可以被用來初始化陣列(amoung其他外)。

+0

我會改變它的價值,所以const不會工作? – SuperString 2009-12-28 16:45:31

+2

但是,它比使用'#define'更好。 – 2009-12-28 17:14:25

10

使用std :: vector,在任何關於C++的好書中都有描述。

向量就像一個數組,但可調整大小, 其初始大小也不一定是編譯時常量。

#include <vector> 

std::vector<nlist*> hash; //empty hash 
hash.resize(1010081); //now it has 1010081 elementns 
1

既可以使用std::vector所推薦的robson3.14或new在堆上分配陣列。如果你選擇在堆上分配,一定要delete []

4

爲什麼你的散列表有一個全局變量?相反,您應該創建一個結構或類,它可以包含表的大小和指向表的指針,並動態分配其內存。以下內容具有默認大小,但創建哈希表時可以傳遞不同的大小以嘗試不同的大小。

class HashTable { 
public: 
    HashTable(int size = 1010081) : m_size(size) { 
    m_table = new nlist *[m_size]; 
    } 
    ~HashTable() { 
    delete[] m_table; 
    } 

    // Define getters, setters, etc. here... 

private: 
    int m_size; 
    struct nlist **m_table; 
}; 

注:我假設(基於這樣的事實,你想實現自己的哈希表,以及一些你以前的問題),您有興趣瞭解低級實現一個哈希表,因此我給你一個關於如何自己分配和釋放內存的相當低級的答案。在一個真實世界的程序中,使用std::vector(正如其他幾個答案所述),可能是正確的做法,因爲它減少了您自己需要的簿記量。再次,在真實世界的程序中,您可能不想實現自己的哈希表,而是使用現有的表格實現,如hash_map(不是標準的,但廣泛可用),boost::unordered_mapstd::tr1::unordered_map(這是成爲標準的軌道,並基於boost::unordered_map)。

0

可變長度數組已添加到C中的C99。但是C99標準中沒有包含C99。 GCC 4.2。2允許在C++中使用可變長度的數組(here

話雖如此,使用std :: vector或new運算符在堆上分配數組始終適用於大內存分配,因爲堆棧空間可能是有限的和超出堆棧是一個不可迴避的錯誤。總是可以檢查堆分配。