Как я могу создать 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?
Как я могу создать 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?
vector<vector<int> > a;
Если вы хотите определить строки и столбцы,
vector<vector<int> > a{{11, 2, 4}, {4, 5, 6}, {10, 8, -12}};
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 по С++ относительно этого здесь
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];
}
}
Если вам не нужно использовать векторы, вы можете попробовать Boost.Multi_array. Вот краткое описание .
Объявление матрицы, например, с 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));
Предложение dribeas действительно способ пойти.
Чтобы указать причину, по которой вы, возможно, захотите перейти по маршруту operator(), подумайте, что, например, если ваши данные разрежены, вы можете по-разному раскрыть их, чтобы сэкономить место внутри, а operator() скрывает эту проблему внутренней реализации из вашего конечный пользователь дает вам лучшую инкапсуляцию и позволяет вам сделать пространство или скорость улучшать изменения во внутреннем макете позже, не нарушая ваш интерфейс.
Как указал Ари, vector< vector< int>>
- верный способ сделать это.
В дополнение к этому, в таких случаях я всегда рассматриваю обертывание внутреннего вектора (фактически, независимо от того, что он представляет) в классе, потому что сложные структуры STL имеют тенденцию становиться неуклюжими и запутанными.
Просто используйте следующий метод для использования двумерного вектора.
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).