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

C++: Work with a pointer to an array

本文关键字:数组 指针 C++      更新时间:2023-10-16

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

我的哈希表应该是list对象的数组。 std::list 是我唯一被允许用于赋值的标准库数据类,所以 vector 被淘汰了。

我的问题是:如何声明指向 std::list 数组的指针?我有:

private:
    std::list<T> * table;

如何创建阵列?我有:

table = new std::list<T>[3]; // start with table size 3

我想我有声明和解释的权利,但我不是100%确定。最后,我如何与列表的交互?我有:

    for (int i = 0; i < _tableSize; i++) { // _tableSize is the array's size
        if (!table[0][i].empty()) {
            table[0][i].push_back(thing);
        }
    }

不知何故,表[0][i]似乎对访问table指向的数组单元格是错误的。它应该是什么样子的?

因为table是一个std::list*table[i][j]表示(table + i)->operator[](j);也就是说,它从地址table + i开始在std::list对象上调用一个成员函数(带有参数j)。

因此,由于std::list不会重载[],因此table[0][i].empty()是错误的(如果std::list<T>中的T是这样的,则双重错误,以至于它没有成员函数empty)。

简而言之,我认为您需要的是一个简单的table[list_index_on_array].empty()来检查空虚。

其他一切看起来都不错。

如果类 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);

你用[0]做什么?只要[i]就足够了。