Могу ли я иметь массив с разным количеством столбцов в каждой строке? - PullRequest
2 голосов
/ 06 мая 2019

Я хочу использовать массив для хранения списка смежности для графа.В котором каждый узел имеет разное количество узлов, связанных с ним.Поэтому я просто хочу иметь массив следующего типа:

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 ]

7 голосов
/ 06 мая 2019

Вы можете использовать вектор векторов 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 
3 голосов
/ 06 мая 2019

То, что вы хотите, частично достижимо с помощью ключевого слова new, но не совсем так, как вы думаете. Для трехмерного массива все элементы должны иметь первое измерение одинакового размера. Кроме того, каждый 2D-массив в нем должен иметь одинаковый размер строки. 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], 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, если размеры одинаковы

...