我有一个整数矩阵,应该像缓冲区一样:
x = {{0, 0, 0, 0, 0}, {1, 1, 1, 1, 1}, {2, 2, 2, 2, 2}};
现在,如果我添加新行{3, 3, 3, 3, 3}
,新矩阵应如下所示:
x = {{1, 1, 1, 1, 1}, {2, 2, 2, 2, 2}, {3, 3, 3, 3, 3}};
有没有一种巧妙的方法可以在不复制所有元素的情况下这样做?
答案 0 :(得分:8)
如果您的矩阵定义为int **
并且您单独分配每一行,那么您只需要交换行指针。
答案 1 :(得分:6)
模运算怎么样?
如果您将元素作为matrix[x + SZ * y]
访问,则可以将其更改为:
matrix[x + SZ * ((y + FIRST_ROW) % SZ)]
。
通过这种方式来实现这种转换,你只需将新行{3,3,3 ..}放在行{0,0,0}所在的位置,然后递增FIRST_ROW
计数器以指向新的起始行。
答案 2 :(得分:1)
使用链接列表。
struct node
{
int row[5];
struct node *next;
};
追加一行就像将列表移到最后一样简单,然后用新节点(其下一个指针为NULL)替换NULL下一个指针。
答案 3 :(得分:1)
你能增加x
以便它指向第二行,然后释放第一行吗?显然,您需要一次分配一行,这不能保证矩阵是连续的。如果你需要,你可以分配一大块内存来保存矩阵,然后在你到达目的地时破坏未使用的部分。
答案 4 :(得分:1)
如果使用指向数组的指针数组(而不是普通的二维数组),则只能将指针复制到行而不是复制所有元素。
如果您可以使用指针数组进行过度分配,则可以在末尾添加一个新指针并将指针前进到数组的“start”。但如果您可能想多次进行此类转换,这不是一个好主意。当然,您需要确保将原始指针放在某处,以便正确free()
您的资源。
答案 5 :(得分:1)
懒惰编写代码示例 - 您可以使用模数算术来处理行。推送新行时,只需增加起始偏移量变量,添加矩阵高度并按矩阵高度对结果进行模数计算。通过这种方式,您可以获得一个圆形矩阵,无需复制整个矩阵并保持矩阵阵列的紧凑。