Правильный способ объявления двумерного массива переменной длины в 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/.

Другие вопросы по тегам