C++ 我可以有一个每行列数不同的数组吗?

C++ 我可以有一个每行列数不同的数组吗?,c++,algorithm,multidimensional-array,data-structures,graph,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 您可以使用int的向量向量,在每一行中可以存储不同数量的元素(节点) 下面是一个示例代码 #include <iostream> #include <vector> int main() { using

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

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

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

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

这是两个元素
A[0]
A[1]
在每个元素中,还有另外两个元素
A[0][0]、[0][1]
A[1][0]、[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]
引用[0]有4种方式,引用[1]只有1种方式 在第二维度中也可能出现这种情况:

A = [[[y1_x1,y1_x2],],y2], y3]
有两种方法可以引用[0][0],但只有1表示[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
循环可以简化此过程,
std::vector
将允许这样做……您需要数组的原因是什么?您可以使用链表作为邻接列表。是的,您可以。双指针数组。每个索引都可以初始化为一个可变长度的数组。我个人鼓励在系统的设计部分努力工作,以提高效率并减少不必要的资源使用。在这种情况下,我建议您考虑一种使用单个数组/向量来完成这项工作的方法。祝你好运,记住:困难时期带来好的想法@KorelK——如果二维数组具有统一的列长度,那么一维数组或向量就可以工作。然而,如果每一行包含不同数量的列(正如OP的数据所显示的那样),那么使用单个数组就很难实现这个问题,而且可能更复杂。不需要为了“高效”而这样做。也可以使用
char**
给出相同的示例,向OP明确显示在这种情况下需要malloc(然后是free)向量和记忆这些向量的长度不能使用吗?@布鲁诺,我认为应该是C++程序员应该选择的第二个选项,只要<代码> STD::vector < /代码>解决问题。这可能只是另一个答案。我说过,为了让OP能够比较您使用数组的正确/简单方式和复杂方式,因为OP的问题是“如何使用数组”,而您的答案是“看看如何使用std::vector”,所以您不必回答OP的问题,我认为最好多说一点来解释为什么代码使用数组;-)
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]