我可以在每行中使用具有不同列数的数组吗?

时间:2019-05-06 16:51:25

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

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

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 

2 个答案:

答案 0 :(得分:7)

您可以使用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 

答案 1 :(得分:3)

使用new关键字可以部分实现所需的功能,但并不完全符合您的想法。对于3D阵列,所有元素都必须具有相同大小的第一维。此外,其中的每个2D数组必须具有相同的行尺寸。 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]

有4种方式引用A [0],只有1种方式引用A [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循环简化此过程