Инициализация матрицы смежности в c ++ - PullRequest
0 голосов
/ 15 октября 2018

Я работаю над реализациями графов в C ++ и натолкнулся на реализацию матрицы смежности, которая в большинстве случаев имела для меня смысл.Реализация использует функцию «init» для инициализации матрицы:

void init(int n) {

    numVertex = 0;
    numEdge = 0;

    mark = new int[n]; //initialize mark array
    for (int i = 0; i < numVertex; i++) {
        mark[i] = 0;
    }

    matrix = (int**) new int*[numVertex]; //make matrix
    for (int i = 0; i < numVertex; i++) {
        matrix[i] = new int[numVertex];
    }

    for (int i = 0; i < numVertex; i++) { //mark all matrix cells as false
        for (int j = 0; j < numVertex; j++) {
            matrix[i][j] = 0;
        }
    }
}

Строка, в которой я запутался, такова:

 matrix = (int**) new int*[numVertex]; //make matrix

Что делает аспект (int**)?Почему я выбрал бы это вместо matrix = new int**[numVertex];?

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Обратите внимание, что matrix = new int**[numVertex];, как вы упомянули, создаст (для этого примера) 3D-массив, потому что у вас будет numVertex записей int**.

. Приведение (int**) недостигните многого, если вообще что-нибудь, потому что, если matrix имеет тип int**, то нет необходимости в приведении (вы получаете int** уже из new).

0 голосов
/ 15 октября 2018

Если размер столбца фиксирован, вы можете использовать вектор массива там. godbolt wandbox

#include <vector>
#include <array>
#include <iostream>
#include <iomanip>

template<typename T, int col>
using row_templ = std::array<T,col>;

template<typename T, int col, template <typename,int> typename U = row_templ>
using mat_templ = std::vector<U<T,col>>;

int main()
{
    constexpr int numVertex = 30;
    constexpr int numEdge = 30;
    constexpr int numCol = numVertex;
    int numRow = numEdge;
    using row_t = row_templ<int, numCol>; // alias to the explicit class template specialization
    using mat_t = mat_templ<int, numCol>;
    auto make_mat = [&](){ return mat_t(numRow); }; // define a maker if lazy

    mat_t my_mat(numRow);
    mat_t my_mat2 = make_mat(); // or just use our maker
    // Due to that default allocator uses value initialization, a.k.a T().
    // At this point, all positions are value init to int(), which is zero,
    // from value init of array<int, col>() by the default allocator.
    // numVertex x numEdge is one solid contaguous chunk and now ready to roll.

    // range for
    for (row_t r : my_mat) {
        for (int n : r) {
            std::cout << std::setw(4) << n;
        }
        std::cout << '\n';
    }

    // classic for
    for (int i = 0; i < numRow; ++i) {
        for (int j = 0; j < numCol; ++j) {
            std::cout << std::setw(4) << (my_mat2[i][j] = i*numRow + numCol);
        }
        std::cout << '\n';
    }

}
0 голосов
/ 15 октября 2018

(int**)value - это операция приведения в стиле C.

Примечания:

  • Не используйте их в C ++, это имеет тенденцию вызывать или скрывать проблемы, такие как несоответствия междуправая и левая сторона назначения.
  • Код относительно низкого качества, для правильного C ++ лучше использовать std::vector.
  • Код также не полный, поэтому с уверенностью можно сказать немногоо том, как это работает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...