所以我有這樣的事情全局變量
#define HASHSIZE 1010081
static struct nlist *hashtab[HASHSIZE];
現在我希望能夠改變我hashtab的HASHSIZE,因爲我想測試不同的素數數,看看哪會少給我的碰撞。但是數組並不需要可變大小,所以HASHSIZE必須是一個常數。有沒有辦法去解決這個問題?
所以我有這樣的事情全局變量
#define HASHSIZE 1010081
static struct nlist *hashtab[HASHSIZE];
現在我希望能夠改變我hashtab的HASHSIZE,因爲我想測試不同的素數數,看看哪會少給我的碰撞。但是數組並不需要可變大小,所以HASHSIZE必須是一個常數。有沒有辦法去解決這個問題?
爲什麼不使用std::vector
而不是在C++中使用數組?
如:
std::vector<nlist *> hashtab;
hashtab.resize(<some_value>);
但不管怎麼說,你可以,如果你使用的是g++
因爲g++
支持可變長度的數組(VLA)作爲擴展做到這一點。
例如:
int HASHSIZE=<some_value>
static struct nlist *hashtab[HASHSIZE];
爲什麼你不使用常量?
const int HASHSIZE = 1010081;
常量是提供給編譯器作爲一個文字值,因此它可以被用來初始化陣列(amoung其他外)。
我會改變它的價值,所以const不會工作? – SuperString 2009-12-28 16:45:31
但是,它比使用'#define'更好。 – 2009-12-28 17:14:25
使用std :: vector,在任何關於C++的好書中都有描述。
向量就像一個數組,但可調整大小, 其初始大小也不一定是編譯時常量。
#include <vector>
std::vector<nlist*> hash; //empty hash
hash.resize(1010081); //now it has 1010081 elementns
既可以使用std::vector
所推薦的robson3.14或new
在堆上分配陣列。如果你選擇在堆上分配,一定要delete []
爲什麼你的散列表有一個全局變量?相反,您應該創建一個結構或類,它可以包含表的大小和指向表的指針,並動態分配其內存。以下內容具有默認大小,但創建哈希表時可以傳遞不同的大小以嘗試不同的大小。
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_map
或std::tr1::unordered_map
(這是成爲標準的軌道,並基於boost::unordered_map
)。
可變長度數組已添加到C中的C99。但是C99標準中沒有包含C99。 GCC 4.2。2允許在C++中使用可變長度的數組(here)
話雖如此,使用std :: vector或new運算符在堆上分配數組始終適用於大內存分配,因爲堆棧空間可能是有限的和超出堆棧是一個不可迴避的錯誤。總是可以檢查堆分配。
我們需要更多信息。你是否試圖隨時調整散列表的大小?你可以使用'std :: vector'而不是本地數組,但是在重新調整大小時,你必須重新提取表中已經存在的所有內容。 – 2009-12-28 16:49:35
re-bucket ??????????? – SuperString 2009-12-28 19:33:05
@SuperString Adrian意味着如果你在分配它之後改變了一個向量的大小,你將不得不重新計算每個元素所在的桶。我認爲你並沒有要求調整現有的哈希表,但我認爲你只是詢問如何創建不同大小的哈希表。 – 2009-12-28 23:48:46