2012-02-29 68 views
2

我需要在运行时为散列表分配创建一个链接列表数组。我们给出的示例代码只允许创建静态大小的数组,我无法弄清楚如何修改它以使用变量,因为我尝试过的所有内容都会导致错误。如何创建动态大小的链接列表数组?

示例代码:

typedef std::list<int> INT_LIST; 
typedef INT_LIST* INT_LIST_POINTER; 
int size = 13; 
INT_LIST_POINTER myArray[size]; 
INT_LIST_POINTER tmpPtr; 
// initialize the array to point to empty lists 
for (int i=0; i<size; i++){ 
tmpPtr = new INT_LIST; 
myArray[i] = tmpPtr; 
} 

在我当前的非工作代码:

typedef std::list<int> INT_LIST; 
typedef INT_LIST* INT_LIST_POINTER; 
INT_LIST_POINTER myArray = new INT_LIST[p]; 
INT_LIST_POINTER tmpPtr; 
for (int i=0; i<n; i++){ 
INT_LIST* temp = new INT_LIST; 
myArray[i] = temp; 
} 

的主要问题似乎是与

myArray[i] = temp; 

这也不说那些操作数相匹配。

+0

查看'std :: vector.resize'和'std :: vector.push_back'方法。 – 2012-02-29 09:25:44

+0

如果你想结束你的老师,请指出示例代码是无效的C++。它应该是'const int size = 13;'。为了演示这一点,使用例如带有'-pedantic-errors'选项的GCC来禁用非标准语言扩展。 – 2012-02-29 09:42:29

+0

所有大写标识符(按惯例)用于在短时(例如T,U,T2)表示模板参数,否则为预处理器宏。它们不应该用于类型。一个小问题,但足以让我想到谁给你你的示例代码没有线索。此外,为什么当你只需要一个'std :: list'数组时,有一个指向'std :: list'的指针数组?它效率较低,维护性较差(请注意 - 取消分配代码 - “delete”的另一个循环)从样本中缺失)。 – 2012-02-29 10:04:05

回答

2

如果这是C++,为什么不使用std

std::vector<std::list<MyClass> > x; 
+1

这显然是一个很好的答案,但OP标记了“家庭作业”的问题,所以如果他不能在'std ::'内使用任何东西,我不会感到惊讶。 – ereOn 2012-02-29 09:04:08

+0

忘记包含这两行 'typedef std :: list INT_LIST; \t typedef INT_LIST * INT_LIST_POINTER;' – 2012-02-29 09:05:57

+0

@ereOn他使用'std :: list'所以'std :: vector myArray;'应该也可以。 – 2012-02-29 09:17:51

2

您分配大小p的数组:

INT_LIST_POINTER myArray = new INT_LIST[p]; 

,然后进行初始化n元素:

for (int i=0; i<n; i++){ 

除非pn是一样的东西,这看起来不正确。

P.S.当你完成它时,不要忘记delete[] myArray

+0

谢谢你指出,你是正确的。 – 2012-02-29 09:09:26

+0

更重要的是这再次分配一个固定大小的数组。 – 2012-02-29 09:22:03

+0

你也是对的,我已经改变了原来的文章中的措辞,我不需要它是完全动态的。 – 2012-02-29 09:28:20