Многомерный вектор - PullRequest
30 голосов
/ 05 мая 2009

Как я могу создать 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?

Ответы [ 8 ]

32 голосов
/ 05 мая 2009

vector<vector<int> > a;

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

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

30 голосов
/ 05 мая 2009
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

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

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

13 голосов
/ 05 мая 2009
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];
    }

}
6 голосов
/ 05 мая 2009

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

2 голосов
/ 27 июля 2018

Объявление матрицы, например, с 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)); 
0 голосов
/ 06 июля 2016

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

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) в качестве второго аргумента в конструкторе, т.е.

0 голосов
/ 05 мая 2009

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

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

0 голосов
/ 05 мая 2009
Предложение

дрибеев - действительно путь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...