在c ++中将一维数组转换为二维数组

时间:2014-12-16 11:21:01

标签: c++ arrays multidimensional-array casting

我需要创建一个带有动态分配内存的二维数组(这两个维度都将在运行时设置),但出于效率目的,我想创建一个具有连续分配内存的一维版本,但又一些想要的将它用作二维数组。有没有办法使用强制转换来实现这一点。 我想要实现的用法如下,显然不起作用。 最好,

int size = 4;
int* arr = new int[size];
arr[0] = 10;
arr[1] = 11;
arr[2] = 12;
arr[3] = 13;
cout << (int[][2])arr[1][1] << endl;

3 个答案:

答案 0 :(得分:2)

由于这是C ++,你可以包装一维数组(由于地点要求而必需)和重载operator()以允许使用一些合适的索引计算进行二维访问。

答案 1 :(得分:2)

虽然我认为Codor的解决方案最符合C ++的编码风格,但我想以C风格分享我的解决方案。

#include <iostream>

typedef int (*pint2)[2]; //pint2 is a pointer to an array of 2 ints

int main()
{
    int arr[4] = { 0, 1, 2, 3 };
    pint2 parr = (pint2)arr;
    std::cout << parr[0][0] << std::endl;
    std::cout << parr[0][1] << std::endl;
    std::cout << parr[1][0] << std::endl;
    std::cout << parr[1][1] << std::endl;

    getchar();
    return 0;
}

希望这有帮助! (或者至少你发现这很有趣:/)

编辑:对于可变长度的数组!

#include <iostream>

int main()
{
    int arr[12] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
    const int sizeofarr = sizeof(arr)/sizeof(arr[0]); //Number of elements in array

    {
        const int numofrows = 2; //Number of rows
        const int numofcolumns = sizeofarr/numofrows; //Number of columns
        typedef int (*pinta)[sizeofarr/numofrows]; //A 2D array of columns of 2

        pinta parr = (pinta)arr;
        for(int i = 0; i < numofrows; ++i)
            for(int j = 0; j < numofcolumns; ++j)
                std::cout << parr[i][j] << std::endl;
    }

    {
        const int numofrows = 3; //Number of rows
        const int numofcolumns = sizeofarr/numofrows; //Number of columns
        typedef int (*pinta)[sizeofarr/numofrows]; //A 2D array of columns of 3

        pinta parr = (pinta)arr;
        for(int i = 0; i < numofrows; ++i)
            for(int j = 0; j < numofcolumns; ++j)
                std::cout << parr[i][j] << std::endl;
    }

    getchar();
    return 0;
}

答案 2 :(得分:0)

g ++使用-fpermissive:

编译以下略微更改的行(运算符优先级)
cout << ((int[][2])arr)[1][1] << endl;

我认为它是UB(任何人?)但我也认为它在所有“常见”平台上都能正常工作。