我正在努力学习声明,创建和操作指向列表对象数组的指针所需的语法。我正在为课程作业创建一个哈希表模板类,使用链接来处理碰撞。
我的哈希表应该是list
个对象的数组。 std::list
是我允许用于分配的唯一标准库数据类,因此向量已经用完了。
我的问题是: 如何声明指向std :: list数组的指针?我有:
private:
std::list<T> * table;
如何创建阵列?我有:
table = new std::list<T>[3]; // start with table size 3
我认为我有声明和建设权,但我不是百分百肯定。最后,我如何与列表进行交互?我有:
for (int i = 0; i < _tableSize; i++) { // _tableSize is the array's size
if (!table[0][i].empty()) {
table[0][i].push_back(thing);
}
}
以某种方式,table [0] [i]似乎错误地访问table
指向的数组的单元格。它应该是什么样的?
答案 0 :(得分:3)
由于table
是std::list*
,table[i][j]
表示(table + i)->operator[](j)
;也就是说,它从地址j
开始的std::list
对象上调用成员函数(带参数table + i
)。
由此可见,由于std::list
不会超载[]
,table[0][i].empty()
是错误的(如果T
中的std::list<T>
是这样的,则会出现双重错误成员函数empty
)。
很快,我认为您需要的是一个简单的table[list_index_on_array].empty()
来检查空虚。
其他一切看起来都不错。
答案 1 :(得分:0)
如果类Foo
有一个指向T列表数组的指针,它的声明将如下所示:
#define NUMBER_OF_LISTS 100
template <typename T>
class Foo {
std::list<T> (*table)[NUMBER_OF_LISTS];
Foo (std::size_t = 1);
};
并且,为了初始化它,Foo的构造函数可以进行如下分配:
template <typename T>
inline Foo<T>::Foo (std::size_t entries)
: table(new std::list<T>[entries][100]) {}
现在,您必须访问table
的代码才有效,但您也可以这样做:
(*table)[i].push_back(something);
答案 2 :(得分:-1)
您使用[0]
做什么用途?只需[i]
即可。