如何在c ++中从普通数组创建一个多维数组

时间:2014-12-06 19:52:22

标签: c++ arrays multidimensional-array

如果我有一个数组,让我说15个元素无论如何我都可以把它变成一个2x阵列,它有5x3? 或者,如果我有一个包含15个字母的字符串,是否可以将其制作成5x3的2d数组?

这就是我所拥有的(使用变量但在控制台中使用5作为a和3作为b)

    void finishMap(string map, int a, int b)
{
    string finalMap[a][b];
    for(int i = 0; b>i; i++)
    {
        for(int x = 0; a>x; x++)
        {
            finalMap[a][b] += {{map[x]}, {i}};
        }
    }
}

对c ++来说也是新手,所以如果你看到任何我不应该告诉我:3

4 个答案:

答案 0 :(得分:0)

您始终可以在 strides 中访问数组。这是一个使用模板将一维数组作为二维数组重新转换的可能示例:

template <typename T, unsigned int N1, unsigned int N2>
struct strider
{
    using array_type = T[N1 * N2];

    array_type & data_;

    Strider(array_type & data) : data_(data) {}

    T & operator()(std::size_t i1, std::size_t i2)
    {
        return data_[i1 * N2 + i2];
    }
};

template <unsigned int N1, unsigned int N2, T>
strider<T, N1, N2> stride(T (&a)[N1, N2]) { return {a}; }

用法:

int a[15] = {};

strider<int, 3, 5> s(a);
s(1, 2) = 20;
assert(a[7] == 20);

stride<5, 3>(a)(4, 2) = 10;
assert(a[14] == 10);

我为了跨步访问而重载了operator(),因为与operator[]不同,它可以有arbirary签名。

通过更多的工作,您可以使跨步视图的等级变为可变。

答案 1 :(得分:0)

您可以尝试使用reinterpret_cast。完整的例子:

#include <iostream>

using namespace std;

typedef char mtrx[5][3];

int main(){
   char data[15] = "Some String";
   mtrx &m = *reinterpret_cast<mtrx*>(&data);
   m[1][2] = '*';
   cout << data << endl;
   return 0;
}

答案 2 :(得分:0)

我在我的回答中使用了char数组(c字符串),因为我认为它们对于说明数组的工作原理很有用 - 而且在你的情况下使用std :: string确实不是一个重点。 std::string隐藏了许多基本的细节和螺栓,所以我通常建议首先使用C字符串来理解std::string的工作原理。另外,请查看本教程:http://www.cplusplus.com/doc/tutorial/arrays/

二维数组具有与一维数组相同的存储器布局。在内存布局方面,char[3][5]char[3*5]相同,与char[15]相同。您可以使用{1}将1维数组用作2维数组。如果您使用下标,唯一的区别是编译器会记住有多少维度,并将为您完成整个char[column+row*width]计算。

举个例子:

column+row*width

将打印:

char temp[5] = "abcd"; //need 5 for string termination char `\0`

for(int i = 0; i < 4; ++i) {
    std::cout << temp[i];
}        
std::cout << "\n\n";

for(int i = 0; i < 2; ++i) {
    for(int j = 0; j < 2; ++j) {
        std::cout << temp[j+2*i];
    }
    std::cout << std::endl;
}

答案 3 :(得分:0)

哦,所以我使用的东西与我提到的有点不同。我所做的是让用户输入3行5个长度的字母,我想出了如何添加到2d数组。如果你和我有同样的问题,那就是我的代码:

int main()
{
    string path;
    int a, b;
    cin >> a >> b;
    string finalMap[a][b];

    for(int i = 0; b>i; i++){
        cin >> path;
        for(int x = 0; a>x; x++){
            finalMap[x][i] = (path[x]);
        }
    }

    for(int x = 0; b>x; x++)
    {
        for(int y = 0; a>y; y++)
        {
            cout << finalMap[y][x];
        }
        cout << endl;
    }
    return 0;
}

感谢您的尝试,非常感谢^ .-