0

有没有办法找出array最后一个被修改的单元格中的哪个单元格?(例如更改其值) 在任何基于编译的语言中。

例如假设我们array1n单元格定义。现在将值array1[2]更改为 1,在该值array1[7]更改为 1 之后,我想要一个解决方案来找出7th最后一个修改的单元格。

4

2 回答 2

0

这些似乎都不是特别好的解决方案,但它们都可以在 C++ 中完成你想要的:

int indexToChange, lastIndexChanged;
int array1 [10];

indexToChange = 2;
array1[indexToChange] = 1;
lastIndexChanged = indexToChange;

indexToChange = 7;
array1[indexToChange] = 1;
lastIndexChanged = indexToChange;

然后在任何时候 array1[lastIndexChanged] 将是最近更新的。但这很烦人,因为每次数组更新都需要 3 个命令。相反,您可以将其包装成一个函数:

void changeArray(int array[], int length, int indexToChange, int newVal){
   array[indexToChange] = newVal;
   lastIndexChanged=indexToChange;
}

这将要求您的所有数组更新看起来像这样(假设lastIndexChanged已全局声明并且array1大小为 10):

changeArray(array1, 10, 2, 1);
changeArray(array1, 10, 7, 1);

然后,要将最近更改的元素更新为 0:

changeArray(array1, 10, lastIndexChanged, 0);

但是,这两个示例都只适用于程序中的单个数组,这对我来说似乎不是特别有用。


我唯一的其他想法涉及创建一个元组数组(或类似的东西)并将元组的第二个元素用作以下之一:

  1. bool指示元素是否是最后一个更改的标志
  2. int指示元素“年龄”的标志

但是,这两种方法都需要在每次数组更新时访问数组的每个元素。

对于 (1),每次更新时,您都必须确保找到上次更新的元素并将其标志设置为,false因为您将要更新的元素的标志设置为true

对于 (2),每次数组更新时,您都会增加每个元素的“年龄”标志,但将更新的元素的“年龄”设置为0. 这样做的好处是您还可以找到第 n 个最后更新的元素。

在任何一种情况下,如果您的原始数组是一个整数数组,您可以使用具有两行的二维数组来实现这一点。因此,如果array1大小为 n,您将拥有int array1[2][n]一个这样的数组(对于 n=4,假设所有单元格都初始化为 0):

[0][0][0][0]
[0][0][0][0]

您将在其中使用顶行作为值,将底行用于标志。因此,数组更新看起来像这样:

对于“bool”标志(仅使用 0 和 1 来模拟 bool 值):

array1[0][2] = 1; //set value of element 2 to 1
array1[1][getLastUpdated()]=false; //resetting the previous "last updated" flag
array1[1][2] = true;

对于“年龄”标志:

array1[0][2] = 1; //set value of element 2 to 1
for (int i=0; i<array1Length; i++){
    array1[1][i]++; //increment ages of every element
}
array1[1][2] = 0; //reset age of the element you just updated

然后,要查找最近更新的元素,您将分别搜索array[1][n]totrue0

于 2013-11-08T18:31:23.997 回答
0

只是不要直接访问数组,在函数/方法中写入它并跟踪它的变化。C#有一些属性/索引器可以为您将调用包装在X = 2一个方法中。

于 2013-11-08T17:02:13.710 回答