所以我有类似的东西
#define HASHSIZE 1010081
static struct nlist *hashtab[HASHSIZE];
现在我希望能够更改hashtab的HASHSIZE,因为我想测试不同的素数,看看哪个会减少碰撞。但Arrays不采用可变大小,因此HASHSIZE必须是常量。有办法解决这个问题吗?
答案 0 :(得分:10)
使用std :: vector,在任何关于C ++的好书中都有描述。
Vector就像数组一样,但可以调整大小, 它的初始大小也不必是编译时常量。
#include <vector>
std::vector<nlist*> hash; //empty hash
hash.resize(1010081); //now it has 1010081 elementns
答案 1 :(得分:10)
为什么不使用std::vector
而不是在C ++中使用数组?
例如:
std::vector<nlist *> hashtab;
hashtab.resize(<some_value>);
但是,如果您使用g++
,则可以执行此操作,因为g++
支持可变长度数组(VLA)作为扩展名。
例如:
int HASHSIZE=<some_value>
static struct nlist *hashtab[HASHSIZE];
答案 2 :(得分: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
,正如其他几个答案所描述的那样,可能是正确的做法,因为它减少了你自己需要做的簿记量。然后,在一个真实世界的程序中,您可能不希望实现自己的哈希表,而是使用现有的has表实现,如hash_map
(非标准,但可广泛使用),{{3} },或boost::unordered_map
(这是成为标准,并基于boost::unordered_map
)。
答案 3 :(得分:1)
您可以按照robson3.14的建议使用std::vector
,也可以使用new
在堆上分配数组。如果您选择在堆上分配,请务必delete []
答案 4 :(得分:0)
为什么不直接使用常量?
const int HASHSIZE = 1010081;
编译器可以使用常量作为文字值,因此它可用于初始化数组(其他内容)。
答案 5 :(得分:0)
C99中的C中添加了可变长度数组。但是,C99不包含在C ++标准中。 GCC 4.2.2允许在C ++(here)
中使用可变长度数组话虽如此,使用std :: vector或new运算符在堆上分配数组总是更适合大内存分配,因为堆栈空间可能有限并且超出堆栈是一个不可恢复的错误。始终可以检查堆分配。