用c ++创建一个不可修改的2d数组

时间:2017-02-16 20:25:46

标签: c++ arrays

快速背景,我对java有一些经验,目前是c ++的新手。

我的问题来自于我们必须创建4个不同魔方的任务,但是对于这个特定问题的性质,它们可以是任何2d数组,只要它们是"确切的"在价值观中,只是它们与每一个看起来不同。我的意思是,如果一个二维数组看起来像:

1 2 3
4 5 6
7 8 9

下一个将旋转90度

7 4 1
8 5 2
9 6 3

依旧......

要制作第一个矩阵,我只需制作一个二维数组并使用魔方算法创建它(不相关)

int** square = new int*[size]();
for (int i = 0; i<size; i++) {
   square[i] = new int[size]();
}
//set values to square .. irrelevant to show, could be anything

//way down the code
int** secondSquare = square;

对于第二个第三个和第四个,我需要做的是旋转前一个以获得下一个旋转的方块。然而我的问题并不是我无法翻转阵列,而是在试图翻转它们时,第一个方块的值也在变化。

显然,这是一个关于能够在方块中访问数据而不是在尝试将它们添加到secondSquare时更改它的问题。

我尝试制作它所以方形是一个可修改的指针w常数不可修改的值。

const int** square = new int*[size];

这个问题是我必须在方格之后分配值,这样才能做到这一点。另外,当我初始化secondSquare时,它给出了一个错误,因为它的类型是int **而不是const int **。

有没有更好的方法来处理访问数据的问题而不更改值并在初始化时正确设置两个数组(或对象)?

3 个答案:

答案 0 :(得分:0)

你最好避免完全使用原始指针和array< array<int,3>, 3> square = {{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }}; square[1][1] = 12; // optional const auto &c_square = square; 。这应该是任何C ++课程的高级部分。

这是一种方式:

c_square

现在squaresquare的常量访问者,您可以稍后使用,以避免修改import numpy as np import matplotlib.pyplot as plt V = np.array([[1,1],[-2,2],[4,-7]]) origin = [0], [0] # origin point plt.quiver(*origin, V[:,0], V[:,1], color=['r','b','g'], scale=21) plt.show() 的风险。

答案 1 :(得分:0)

问题是int** secondSquare = square;square指针的地址复制到secondSquare。所以最后你有两个(三个,四个)指针指向内存中完全相同的位置。想想它就像你创建了一个正方形,但是你试图通过四个不同的指针来访问它。

你想要做的是为4个不同的int **指针分配内存。

答案 2 :(得分:0)

要创建二维数组,您可以将其声明为const:

const int array_2d[3][3] =
{
  0, 1, 2,
  3, 4, 5,
  6, 7, 8
};

根据我的经验,更好的方法是将其声明为static const,因此您告诉编译器只有一个只读实例:

static const int array_2d[3][3] =
{
  0, 1, 2,
  3, 4, 5,
  6, 7, 8
};  

static允许编译器将数据放在可执行文件的只读部分并直接访问它,而不是在使用之前将其从只读复制到堆栈(我见过编译器)发出这种代码。)