C ++:使用指向数组的指针

时间:2012-06-09 21:24:17

标签: c++ arrays pointers hashtable

我正在努力学习声明,创建和操作指向列表对象数组的指针所需的语法。我正在为课程作业创建一个哈希表模板类,使用链接来处理碰撞。

我的哈希表应该是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指向的数组的单元格。它应该是什么样的?

3 个答案:

答案 0 :(得分:3)

由于tablestd::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]即可。