C++中二维列表数组的动态初始化

Posted

技术标签:

【中文标题】C++中二维列表数组的动态初始化【英文标题】:Dynamic initialization of 2 dimensional array of lists in C++ 【发布时间】:2018-11-09 17:37:58 【问题描述】:

在我从输入中读取其大小后,我需要初始化一个 2-dim 数组 forward_list。

class Foo

    forward_list<int> * koo;
    int A, B;

    void boo()
        scanf("%d",&A);
        scanf("%d",&B);

        koo = new forward_list<int>[A][B];

        koo[0][0] = 1;
    

;

编译器:

cannot convert ‘std::forward_list<int> (*)[1]’ to ‘std::forward_list<int>*’ in assignment adjList = new forward_list<int>[A][A];

CLion IDE:订阅的值不是数组(在 koo[0])

我不会做太多 C++,所以我不太清楚哪里出了问题。我怎样才能做到这一点?我需要在 O(1) 中访问所有 forward_list,因此,我更喜欢数组或通常更快的东西。

顺便说一句:不确定这是否称为动态初始化,如果我应该更改标题,请告诉我。

谢谢。

【问题讨论】:

为什么需要一个二维数组的前向列表?那是一个非常奇怪的“容器”。你用它做什么? std::vector&lt;std::forward_list&gt;&gt; 似乎是您正在寻找的。但如果你不想要速度,你可能想要 std::vector&lt;std::vector&lt;int&gt;&gt;。链表在现代处理器上非常慢,因为它们需要做的所有指针追逐。一个普通的vector 通常在除了微不足道的情况下都比list 好。 @ChristopherParus 如果您想要任何东西的动态二维数组,首先应该想到的是std::vector&lt;std::vector&lt;whatever&gt;&gt;,其中whatever 是您想要启用二维数组的类型。其他任何事情稍后再讨论。 算法复杂度(大 O)并不是最重要的。对不同的解决方案进行基准测试。尽管理论上插入到列表中更快,但在现实生活中,向量通常更快,因为移动线性内存块通常比追逐指针(不太可能在 CPU 缓存中)更快地到达插入点列表。 链表的快速添加和删除能力很好,但是如果必须迭代列表,好处很快就会消失。使用vector,CPU 准确地知道在哪里可以找到下一个元素,并且可能已经加载了它以及在您需要它之后的大量元素。使用链表,您需要去寻找它(指针追逐),并且由于元素在存储中可能彼此相距不远,您可能无法一次块读取多个。这几乎总是比快速插入和移除所节省的成本更多。 【参考方案1】:

forward_list 无法达到您的性能要求:“我需要在 O(1) 中访问所有 forward_list”您可以在此处的比较中看到:https://en.wikipedia.org/wiki/Linked_list#Linked_lists_vs._dynamic_arrays 您可以看到 forward_list 的索引而其他链表变体是O(n)

提供您正在寻找的O(1) 索引的最简单容器类型是vector 或其他动态数组变体。我相信您当前的需求可以通过执行以下操作来满足:

vector<vector<int>> koo(A, vector<int>(B));

应该提到,虽然这将满足您的性能要求,a vector of vectors isn't a great solution;但您可以将其视为一个很好的权宜之计。

【讨论】:

以上是关于C++中二维列表数组的动态初始化的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中初始化指向动态二维数组的指针 [关闭]

C++二维数组(指针)做参数

使用动态二维数组时的 C++ 分段错误(核心转储)

将字符串列表插入二维向量

C++:使用函数为二维数组分配内存时出错

利用c++中的vector创建动态二维数组