【问题标题】:C++: Work with a pointer to an arrayC++:使用指向数组的指针
【发布时间】:2023-03-18 12:34:01
【问题描述】:

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

我的哈希表应该是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);
        }
    }

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

【问题讨论】:

  • list&lt;list&lt;T&gt;&gt; 怎么样?那只使用list
  • @James Alas,这个任务是不允许的。它必须是(指向)列表对象数组。

标签: c++ arrays pointers hashtable


【解决方案1】:

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

【讨论】:

  • 这不是问题的答案。
  • 这是。你做错的唯一一件事是使用 [0]。其他一切正常。
  • 好的,看看我需要改变什么,是的,这在技术上是一个答案。但这太不清楚了,没有任何帮助。
  • 你遇到了问题,我告诉你如何解决。你没有要求解释。当然,选择权在你。
【解决方案2】:

由于tablestd::list*table[i][j] 表示(table + i)-&gt;operator[](j);也就是说,它在地址table + i 开始的std::list 对象上调用成员函数(带有参数j)。

因此,由于std::list 不会重载[],所以table[0][i].empty() 是错误的(如果T 中的std::list&lt;T&gt; 没有成员函数empty,则会出现双重错误)。

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

其他一切正常。

【讨论】:

  • std::list 没有实现 operator[]。
  • table 应该指向任何数组,而不是数组本身。这仍然适用于那种情况吗?
  • 不,不应该。实际上,C++ 中没有数组,只有指针。所以任何指针都是指向数组的指针。
  • @Pixie:C++ 确实有数组。
  • 好的,如果它是关于编译时类型的,那么它确实有。但在这种情况下,我认为这并不重要。我想说的是它没有像内置数组这样的对象,只有内存缓冲区和类数组类。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2013-04-19
    • 2018-01-04
    • 2023-03-11
    • 2017-11-06
    相关资源
    最近更新 更多