假设我有3个 double 数组a1[]a2[]a3[],它们的长度分别为L1,L2,L3

假设我要“虚拟”连接这些数组,即我想创建一个虚拟
数组a_virtual[],这样从逻辑上讲a_virtual = {a1[L1], a2[L2], a3[L3]},尽管在物理上这些数组可能彼此不连续。

因此,如果我想访问a_virtual[5]L1=2L2=3L3=1,则将获取a3[0]。要访问a_virtual[0],将获取a1[0]
我该怎么做

C语言中的


  • C++中的
  • (如何使用std::vectors代替数组来执行此操作
    也有用)
  • CUDA中的

  • 我怀疑是否有一种方法可以对所有三个环境使用相同的方法,但是根据环境的不同,可能在每个环境中都有更有效的方法可以做到这一点。
    提供的功能。

    最佳答案

    这是使用链表和(尾)递归的C语言解决方案:

    #include <stdio.h>
    
    struct dblarr {
        double *data;
        size_t len;
        struct dblarr *next;
    };
    
    double *fetch(const struct dblarr *arr, size_t index) {
        if (arr == NULL) return NULL;
        if (index < arr->len) return arr->data + index;
        return fetch(arr->next, index - arr->len);
    }
    
    int main(void) {
        double a1[2] = {1, 2};
        double a2[3] = {1, 2, 3};
        double a3[1] = {1};
        struct dblarr x1, x2, x3;
    
        x1.data = a1; x1.len = sizeof a1 / sizeof *a1; x1.next = &x2;
        x2.data = a2; x2.len = sizeof a2 / sizeof *a2; x2.next = &x3;
        x3.data = a3; x3.len = sizeof a3 / sizeof *a3; x3.next = NULL;
    
        printf("before %f\n", *fetch(&x1, 5));
        *fetch(&x1, 5) = 0.42;
        printf(" after %f\n", *fetch(&x1, 5));
    
        return 0;
    }
    

    您可以在http://ideone.com/mY0ix上“查看正在运行的代码”。

    关于c++ - 与数组的虚拟串联,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9231186/

    10-09 13:41