Подтвердить что ты не робот

Многомерный вектор

Как я могу создать 2D вектор? Я знаю, что в 2D массиве я могу выразить это так:

a[0][1]=98;
a[0][2]=95;
a[0][3]=99;
a[0][4]=910;

a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;

Как это сделать, используя C++ STL Vector?

4b9b3361

Ответ 1

vector<vector<int> > a;

Если вы хотите определить строки и столбцы,

vector<vector<int> > a{{11, 2, 4}, {4, 5, 6}, {10, 8, -12}};

Ответ 2

std::vector< std::vector< int > > a; // as Ari pointed

Использование этого для растущей матрицы может стать сложным, так как система не гарантирует, что все внутренние векторы имеют одинаковый размер. Когда вы будете расти во втором измерении, вам придется явно вырастить все векторы.

// grow twice in the first dimension
a.push_back( vector<int>() );
a.push_back( vector<int>() );

a[0].push_back( 5 ); // a[0].size() == 1, a[1].size()==0

Если это нормально с вами (это не совсем матрица, а вектор векторов), вы должны быть в порядке. Кроме того, вам нужно будет проявить особую осторожность, чтобы сохранить стабильное положение второго вектора по всем векторам.

Если вы планируете использовать матрицу фиксированного размера, вам следует рассмотреть вопрос о инкапсуляции в классе и переопределении оператора() вместо предоставления синтаксиса двойного массива. Прочитайте FAQ по С++ относительно этого здесь

Ответ 3

std::vector< std::vector<int> > a;

    //m * n is the size of the matrix

    int m = 2, n = 4;
    //Grow rows by m
    a.resize(m);
    for(int i = 0 ; i < m ; ++i)
    {
        //Grow Columns by n
        a[i].resize(n);
    }
    //Now you have matrix m*n with default values

    //you can use the Matrix, now
    a[1][0]=98;
    a[1][1]=989;
    a[1][2]=981;
    a[1][3]=987;

//OR
for(i = 0 ; i < m ; ++i)
{
    for(int j = 0 ; j < n ; ++j)
    {      //modify matrix
        int x = a[i][j];
    }

}

Ответ 4

Если вам не нужно использовать векторы, вы можете попробовать Boost.Multi_array. Вот краткое описание .

Ответ 5

Объявление матрицы, например, с 5 строками и 3 столбцами:

vector<vector<int> > new_matrix(5,vector<int>(3));

Другой способ объявления, чтобы получить тот же результат, что и выше:

vector<int> Row;    

Один ряд матрицы:

vector<Row> My_matrix;

My_matrix - это вектор строк:

My_matrix new_matrix(5,Row(3)); 

Ответ 6

Предложение dribeas действительно способ пойти.

Чтобы указать причину, по которой вы, возможно, захотите перейти по маршруту operator(), подумайте, что, например, если ваши данные разрежены, вы можете по-разному раскрыть их, чтобы сэкономить место внутри, а operator() скрывает эту проблему внутренней реализации из вашего конечный пользователь дает вам лучшую инкапсуляцию и позволяет вам сделать пространство или скорость улучшать изменения во внутреннем макете позже, не нарушая ваш интерфейс.

Ответ 7

Как указал Ари, vector< vector< int>> - верный способ сделать это.

В дополнение к этому, в таких случаях я всегда рассматриваю обертывание внутреннего вектора (фактически, независимо от того, что он представляет) в классе, потому что сложные структуры STL имеют тенденцию становиться неуклюжими и запутанными.

Ответ 8

Просто используйте следующий метод для использования двумерного вектора.

int rows, columns;        

// . . .

vector < vector < int > > Matrix(rows, vector< int >(columns,0));

                                  Or

vector < vector < int > > Matrix;
Matrix.assign(rows, vector < int >(columns, 0));

// Do your stuff here...

Это создаст столбцы Матрицы столбцов размера * и инициализирует их нулями, потому что мы передаем нуль (0) в качестве второго аргумента в конструкторе i.e vector <int> (столбцы, 0).