所以我有这样的事情全局变量
#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