【问题标题】:Dynamic initialization of 2 dimensional array of lists in C++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 准确地知道在哪里可以找到下一个元素,并且可能已经加载了它以及在您需要它之后的大量元素。使用链表,您需要去寻找它(指针追逐),并且由于元素在存储中可能彼此相距不远,您可能无法一次块读取多个。这几乎总是比快速插入和移除所节省的成本更多。

标签: c++ arrays initialization


【解决方案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;但您可以将其视为一个很好的权宜之计。

【讨论】:

    猜你喜欢
    • 2020-10-30
    • 2012-01-27
    • 2012-07-12
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多