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<std::forward_list>>
似乎是您正在寻找的。但如果你不想要速度,你可能想要 std::vector<std::vector<int>>
。链表在现代处理器上非常慢,因为它们需要做的所有指针追逐。一个普通的vector
通常在除了微不足道的情况下都比list
好。
@ChristopherParus 如果您想要任何东西的动态二维数组,首先应该想到的是std::vector<std::vector<whatever>>
,其中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 vector
s isn't a great solution;但您可以将其视为一个很好的权宜之计。
【讨论】:
以上是关于C++中二维列表数组的动态初始化的主要内容,如果未能解决你的问题,请参考以下文章