【问题标题】:Can I have an array with different number of columns in each row?我可以有一个每行有不同列数的数组吗?
【发布时间】:2019-05-06 16:51:25
【问题描述】:

我想使用一个数组来存储图形的邻接列表。其中每个节点都有不同数量的节点连接到它。所以我只想拥有以下类型的数组:

Row 0: 1 5 3
Row 1: 0 2 3
Row 2: 1
Row 3: 0 1 5 4
Row 4: 3 5
Row 5: 0 1 3 4 

【问题讨论】:

  • 一个std::vector<std::vector<int>> 会允许这个...有什么理由你需要一个数组吗?
  • 邻接表可以使用链表。
  • 是的,你可以。双指针数组。每个索引都可以初始化为一个可变长度的数组。
  • 就个人而言,我鼓励在系统的设计部分努力工作,以提高效率并减少不必要的资源使用。在这种情况下,我建议您考虑一种使用单个数组/向量来完成这项工作的方法。祝你好运,记住:困难时期会带来好的思考!
  • @KorelK -- 如果二维数组具有统一的列长度,那么一维数组或向量将起作用。但是,如果每一行包含不同数量的列(正如 OP 的数据似乎暗示的那样),那么使用单个数组来实现问题就会变得更加困难,并且可能更加复杂。没有必要仅仅为了“高效”而这样做。

标签: c++ algorithm multidimensional-array data-structures graph


【解决方案1】:

您可以使用 int 向量的向量,在每一行中您可以存储不同数量的元素(节点)。

以下是示例代码。

#include <iostream>
#include <vector>

int main()
{
    using Row = std::vector<int>;
    std::vector<Row> rowVec;
    rowVec.reserve(6); // reserve memory if you know the size beforehand.
    // emplace each row of elements to the vector of vectors
    rowVec.emplace_back(Row{ 1, 5, 3 }); 
    rowVec.emplace_back(Row{ 0, 2, 3 });
    rowVec.emplace_back(Row{ 1 });
    rowVec.emplace_back(Row{ 0, 1, 5, 4 });
    rowVec.emplace_back(Row{ 3 ,5 });
    rowVec.emplace_back(Row{ 0, 1, 3, 4 });

    // to iterate throw the vector of vectors
    for (const Row& row : rowVec)
    {
        for (const int element : row)
            std::cout << element << " ";
        std::cout << '\n';
    }
    return 0;
}

输出

1 5 3 
0 2 3 
1 
0 1 5 4 
3 5 
0 1 3 4 

【讨论】:

  • 也可以使用char ** 给出相同的示例,以向 OP 明确显示,在这种情况下,需要 malloc(然后释放)向量并记住长度,否则这些向量不能用过?
  • @bruno 我认为这应该是 C++ 程序员应该选择的第二个选项,只要 std::vector 解决问题。(恕我直言)顺便说一句,这可能只是另一个答案。
  • 我说是为了让 OP 比较您所做的正确/简单的方式和使用数组的复杂方式,因为 OP 的问题是“如何处理数组”,而您的答案是“看看如何与 std::vector 相关”,所以 很好 你不回答 OP 问题,我认为最好多说一些来解释为什么使用数组的代码 ;-)跨度>
【解决方案2】:

使用new 关键字可以部分实现您想要的,但与您的想法不完全一样。对于 3D 数组,所有元素必须具有相同大小的第一维。此外,其中的每个二维数组必须具有相同的行维度。 3D 数组只不过是数组数组的数组,或者更像是矩阵数组。 让我们的 3D 数组为 A 它可能看起来像:

A = [[[y1_x1,y1_x2],[y2_x1,y2_x2]],[[y3_x1,y3_x2,],[y4_x1,y4_x2]]]

这是两个元素 A[0]A[1] 在每个内部,还有两个其他元素 A[0][0], A[0][1]A[1][0], A[1][1] 这四个元素中还有另外两个元素:

A[0][0][0]// which is y1_x1
A[0][0][1]// which is y1_x2

A[1][1][0]// which is y2_x1
A[1][1][1]// which is y2_x2

A[1][0][0]// which is y3_x1
A[1][0][1]// which is y3_x2

A[1][1][0]// which is y4_x1
A[1][1][1]// which is y4_x2

现在想象一下,A[0] 和 A[1] 中的一个元素可能是一个矩阵,而另一个只是一个值,例如:

A = [[[y1_x1,y1_x2],[y2_x1,y2_x1]],y3]

引用 A[0] 的方法有 4 种,而引用 A[1] 的方法只有 1 种 在第二维中也可以这样:

A = [[[y1_x1,y1_x2],],y2], y3]

有两种方法可以引用 A[0][0],但只有 1 可以引用 A[0][1]。

您可以创建一个指针数组,其中每个指针都指向一个数组。

int ***z;
z = new int**[z-size];
z[0] = new int*[y-size];
z[1] = new int*[y-size];
...
z[0][0] = new int[x-size];
z[0][1] = new int[x-size]

如果大小相同,当然可以使用for 循环来简化此过程

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 2012-12-20
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多