【问题标题】:Can I use a pointer to point to multiple sections of an array at once?我可以使用指针一次指向数组的多个部分吗?
【发布时间】:2018-01-18 21:01:47
【问题描述】:

在我正在做的工作中,我声明了一个长度为 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 = (/ 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 /)

同时保持a完整。在我的脑海中,上面的 p 将通过在一个紧凑指针中同时指向 a 的前三个元素,然后是第 6 个元素,然后是第 10 个元素来创建。 p>

我知道我可以使用可分配数组获得相同的结果,但我认为指针非常有用。

【问题讨论】:

    标签: arrays pointers fortran


    【解决方案1】:

    没有。数组指针可以与任何数组部分相关联,但不能与任意元素相关联。

    根据您以后想要做什么,您可以有第二个数组,列出a 中的当前索引,然后对某些操作使用向量下标。但是向量下标数组的使用位置存在限制(例如,如果与虚拟参数相关联,则无法重新定义),并且在某些情况下,向量下标数组的底层实现可能只是创建一个临时连续副本反正相关的元素。

    【讨论】:

      【解决方案2】:

      我通常使用可分配(数据)数组以及另一个作为数据数组掩码的逻辑数组来处理它。然后使用掩码来跟踪数组的哪些元素“正在使用”或“未使用”。当需要时,活动或“正在使用”的元素可以打包到最终或中间数组中,如果是中间数组,则逻辑数组重置为新数据数组的大小。

      而且我通常避免使用指针。

      PACK https://gcc.gnu.org/onlinedocs/gfortran/PACK.html 和 SUM(逻辑数组) 在这里可能有用。

      【讨论】:

        【解决方案3】:

        这取决于对数组中任意位置的访问速度是否比擦除元素的速度更重要。 如果擦除元素是您的首要任务,那么您绝对应该创建一个可以一次擦除 n 个元素的链表结构。 另一方面,如果您需要的是访问数据的速度,您应该使用数组。

        【讨论】:

          猜你喜欢
          • 2021-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-16
          • 1970-01-01
          • 2016-08-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多