0

是否可以在 C++ 中向现有数组添加一维或多维?例如,我有一个二维数组,在某个地方我需要向这个数组添加一个或多个维度。

4

2 回答 2

2

无论如何,正如 poitroae 已经提到的,您将需要某种副本。但是,如果您使用 1-D 数组模拟 2-D 和 3-D 数组,则此副本会大大加快速度,这就是我决定首先发布答案的原因。

为了使用 1-D 数组模拟 2-D 和 3-D 数组,您可以使用简单的数学来索引数组。这降低了内存分段,使其更快,因为有更多的 chache 命中。要添加维度,您只需创建另一个具有适当大小的一维数组,然后复制当前数据。

当我可以找到执行此操作的代码时,我将提供一个示例。

编辑:显然以上不是他想要的。我会在下面再试一次

你有:一个模拟二维数组的一维数组。

似乎您不想实际将整个维度添加到数组中,而只是矩阵。(基本上在保留数据的同时从一种尺寸调整到另一种尺寸)

所以,这里有一个例子:

您在下面有一个 3x3 (U=3, V=3) 矩阵

逻辑表示:

|3 5 6|
|7 2 5|
|1 0 2|

物理表示(int[3*3]“矩阵”)

[3, 5, 6, 7, 2, 5, 1, 0, 2]

--转换为 4x4(X = 4, Y = 4)--

int* newMatrix = new int[X*Y];
for(int i = 0; i < Y; i++)
{
    for(int k = 0; k < X; k++)
    {
        //copy from old if it falls in bounds
        if(k < U && i < V)
        {
            newMatrix[i*X + k] = matrix[i*U + k];
        }
        //Otherwise, zero out
        else
        {
            newMatrix[i*X + k] = 0;
        }
    }
}
delete [] matrix;

那应该给你一个 4x4 newMatrix。

逻辑上:

|3 5 6 0|
|7 2 5 0|
|1 0 2 0|
|0 0 0 0|

物理上:

[3, 5, 6, 0, 7, 2, 5, 0, 1, 0, 2, 0, 0, 0, 0, 0,]

如果你像我一样使用变量,你应该能够编写一个函数,只要你给它准确的参数(矩阵的 X 和 Y 维度),它就可以对任何矩阵执行此操作

换一种方式——缩小尺寸——它应该是一个类似的设置(双循环),你检查你是否在界限内,只有当你在时才复制。如果没有,你根本不复制任何东西。我会让你写那个。

我希望这是您正在寻找的更多内容。我在错误的上下文中跳跃维度。决定更多地用矩阵来思考答案。

于 2013-03-13T17:46:59.390 回答
0

您不能隐式执行此操作。您必须创建一个新的 n 维数组并复制所需的值

int new_array[10][10][10];

// copy using a loop or a std::-function
于 2013-03-13T17:25:27.703 回答