提问人:Ricardo Roel 提问时间:11/9/2023 更新时间:11/9/2023 访问量:93
C++ 矩阵(RAM 中的元素不是连续的)
C++ Matrix (elements in RAM not continous)
问:
(这需要一些上下文,请阅读本文,然后,如果您能向我解释为什么会发生这种情况,我将感谢您的帮助)
之前的一些背景...
好的,在我的大学里,他们教我们两种用 C++ 制作矩阵的方法。
第一种方式是经典
int matrix[rows][columns];
然后,是这样的:
int** matrix = new int*[rows];
for(int i = 0; i < rows; i++)
matrix[i] = new int[columns];
从理论上讲,这是这样工作的。
首先,我们创建一个向量,然后,使用 for,我们遍历向量中的每个空间以创建行,在图像中,首先我们创建绿色列,对于列中的每个数字,我们创建矩阵中的其余元素。
我们学习了如何使用指针访问矩阵中的位置等。一切正常,但是,在一个练习中,我需要对矩阵进行排序,而且,我的第一个问题是“如果矩阵像 ram 中的一个大向量,我应该像向量一样对它进行排序,但在矩阵的第一个元素中有一个指针”,(我在 c 中像这样对矩阵进行排序)。但是当我尝试使用气泡算法进行排序时,矩阵中带来了一些 RAM 垃圾,所以......几个小时后,我试图查看 RAM 和矩阵中的元素是如何分配的,使用 clion 中的调试器,我看到了这一点......
在这种情况下,矩阵的每一行都在连续的RAM空间中,但是,当到达新行时,RAM会无缘无故地跳到13个位置。我不是这方面的专家,因此,我以典型的方式创建了一个矩阵,以查看该矩阵是否具有连续的 RAM 位置和。
正如我所料,矩阵中的元素在RAM中是连续的
问题
为什么会这样?我不是编程的初学者,所以,我知道向量和矩阵应该如何工作。但是,我是低级内存管理器编程语言的乞丐(我通常使用 php、java、python、js 等,但在大学之前从未使用 c/c++)。
而且,C++ 如何知道如何在矩阵中迭代?,因为如果我们用 [i][j] 遍历矩阵可以完美地工作,如果矩阵中的元素不是连续的,C++ 怎么知道如果我们完成迭代一行,将 RAM 中的 13 个空格跳到下一行?
我感谢每一个回答,非常感谢
答:
int matrix[rows][columns];
就像你说的那样是连续的。
int** matrix = new int*[rows];
更像是
每次调用时,都无法保证内存的位置。在内存方面,第二行可能在第一行之前。只要您通过指针访问列,您就不在乎。new
评论
new
new
class matrix{std::size_t col; std:: vector<double> storage; public matrix (std::size_t rows, std::size_t cols): col{cols}, storage(rows*cols){};};
std::vector
评论
matrix[i]
p
p[j]
rows
matrix[i][j]
*(*(matrix+i)+j)
*(matrix+i)
matrix+i
std::array
[][]