2009-12-28 299 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运算符在堆上分配数组始终适用于大内存分配,因为堆栈空间可能是有限的和超出堆栈是一个不可回避的错误。总是可以检查堆分配。