在我正在做的工作中,我声明了一个长度 N 的数组。
在我的代码中的某个时刻,需要删除某些元素之间的数据。
如果我的初始数组是[1,2,3,4,5],我想将其更改为[1,2,4,5]。但我不只是做过一次。该过程将涉及删除每个元素,直到没有剩余元素,并且我可以一次取出多个元素。我这样做的原因与我正在尝试重现的一个复杂过程有关,我认为现在不必进入这个过程。
我希望能够做的是定义一个数组
a = (/ 1, 2, 3, 4, 5 /)
如果我决定删除元素3和4,我可以设置一个指针(称之为 p ),这样它就会指向 a :
p = (/ 1, 2, 5 /)
具体来说, p 的长度等于 a 减去删除的元素数量。我想做的不仅仅是一次。重新定义 a
a = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /)
首先我删除元素4和5并指向它
p = (/ 1, 2, 3, 6, 7, 8, 9, 10 /)
然后删除了7,8,9我可以指向 a
p = (/ 1, 2, 3, 6, 10 /)
同时保持 完好无损。上面的 p 将通过指向 a 的前三个元素然后在一个紧凑的指针中同时指向第6个然后是第10个元素来创建。
我知道我可以使用可分配数组获得相同的结果,但我认为指针非常有用。
答案 0 :(得分:1)
没有。数组指针可以与任何数组部分相关联,但不能与任意元素相关联。
根据您以后想要做的事情,您可以使用第二个数组列出a
中的当前索引,然后对某些操作使用向量下标。但是对于可以使用向量下标数组的位置存在限制(例如,如果与伪参数相关联则无法重新定义),并且在某些情况下,向量下标数组的底层实现可能只是创建临时的连续副本。无论如何,相关元素。
答案 1 :(得分:1)
我通常使用可分配(数据)数组来处理它,还使用另一个逻辑数组作为数据数组的掩码。然后使用蒙版来跟踪阵列的哪些元素在使用中'或者'没有使用'。当需要时,活动或使用中'元素可以打包到最终或中间数组中,如果它是中间数据,则逻辑数组重置为新数据数组的大小。
我通常会避免使用指针。
PACK https://gcc.gnu.org/onlinedocs/gfortran/PACK.html和SUM(逻辑数组)在这里可能很有用。
答案 2 :(得分:0)
这取决于对阵列中任意位置的访问速度是否比擦除元素的速度更重要。 如果擦除元素是您的首选,您绝对应该建立一个链表结构,您可以在其中一次删除n个元素。 另一方面,如果你需要的是对数据的访问速度,你应该使用数组。