C ++中的全局变量

时间:2009-12-28 16:37:18

标签: c++ arrays

所以我有类似的东西

#define HASHSIZE 1010081

static struct nlist *hashtab[HASHSIZE];

现在我希望能够更改hashtab的HASHSIZE,因为我想测试不同的素数,看看哪个会减少碰撞。但Arrays不采用可变大小,因此HASHSIZE必须是常量。有办法解决这个问题吗?

6 个答案:

答案 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运算符在堆上分配数组总是更适合大内存分配,因为堆栈空间可能有限并且超出堆栈是一个不可恢复的错误。始终可以检查堆分配。