Правильный способ объявления двумерного массива переменной длины в C++
Я хотел бы получить двумерный массив int arr
что я могу получить доступ через arr[i][j].
Насколько я понимаю, я мог бы заявить int arr[10][15];
чтобы получить такой массив. В моем случае размер, однако, является переменным, и, насколько я понимаю, этот синтаксис не работает, если размер массива не задан жестко, но я использую переменную, такую как int arr[sizeX][sizeY]
,
Какой лучший обходной путь?
6 ответов
Если вы не хотите использовать std::vector
векторов (или новый C++ 11 std::array
) затем вы должны выделить все подмассивы вручную:
int **arr = new int* [sizeX];
for (int i = 0; i < sizeX; i++)
arr[i] = new int[sizeY];
И, конечно же, не забудьте delete[]
все когда сделано.
C / C++ не поддерживает многомерный массив. Но он поддерживает массив массивов:
//simulate 2-dimension array with 1-dimension array
{
int x = 20;
int y = 40;
int * ar = new int(x*y);
int idx_x =9;
int idx_y=12;
ar[idx_x + idx_y * x] = 23;
}
//simulate 2-dimension array with array of array
{
int x = 20;
int y = 40;
int**ar = new int*[y];
for(int i = 0; i< y; ++i)
{
ar[i] = new int[x];
}
ar[9][12] = 0;
}
Вы не можете, с синтаксисом массива. Язык требует, чтобы вы использовали константы времени компиляции для создания массивов.
C++ не имеет массивов переменной длины. Вы можете рассмотреть возможность использования vector<vector<int> >
, К нему также можно получить доступ, используя arr[i][j]
,
Как сказал fefe, вы можете использовать вектор векторов, например:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector< vector<int> > vec;
vector<int> row1;
row1.push_back(1);
row1.push_back(2);
vector<int> row2;
row2.push_back(3);
row2.push_back(4);
vec.push_back(row1);
vec.push_back(row2);
for( int ix = 0; ix < 2; ++ix)
for( int jx = 0; jx < 2; ++jx)
cout << "[" << ix << ", " << jx << "] = " << vec[ix][jx] << endl;
}
Если вы ищете решение в C, посмотрите этот поток переполнения стека: Как мне работать с динамическими многомерными массивами в C?,
Если C++ в порядке, то вы можете создать двухмерный вектор, то есть вектор векторов. См. http://www.cplusplus.com/forum/general/833/.