从一个阵列到另一个阵列的选择性浅拷贝

时间:2014-07-31 04:29:42

标签: c++ arrays shallow-copy

假设我有2个不同大小的数组,即

int arr[] = {0,1,2,3,4,5,6,7,8,9};
int *arr2 = new int[5];

我想浅透一些, 深层副本等同于

int j =0;    
if(!(i%2))
    {
        arr2[j]=arr[i];
        j++;
    }

现在打印arr2将输出:0,2,4,6,8

我想要浅拷贝的原因是因为我希望arr2能够随着对arr的任何更改而更新。

如果我循环并对arr

中的所有元素进行平方

我希望arr2输出:0,4,16,36,64

这两个数组是同一类的一部分,一个是我的多边形信息,另一个是数据驱动。 arr实际上是4000多个元素,而arr2接近3000.目前我的算法在深度复制方面效果很好。但是因为我需要在每个更新帧中深度复制3000个元素,所以我在浪费资源,并且想知道我是否可以通过浅层复制以某​​种方式执行此操作,因此我不必每帧都更新arr2。我的代码需要它的工作方式,arr实际上有重复的arr2值。 arr2是动画的点列表。然后将数据复制到arr,其中包含顶点的位置数据。这是因为arr包含多个bezier补丁,其中一些补丁与另一个补丁共享一条或多条边。但是我希望在动画时忽略表面上的中断。

重要的是副本涉及像

这样的索引
arr2[j]=arr[i];

因为这就是我的代码设置方式。 而且操作是低负荷的。

3 个答案:

答案 0 :(得分:6)

你需要一个整数指针数组。

int *arr2[5];

for (int i = 0, j = 0; i < 10; i++) {
    if (!(i%2)) {
        arr2[j]= &arr[i];
        j++;
    }
}

所以你需要将arr2的每个元素设置为指向arr2[j]= &arr[i];

中arr中的相应元素

当你需要访问arr2中的元素时,你可以调用类似的东西:int a = *arr2[j];

稍后我要说你将arr [0]更改为10 arr[0] = 10;然后int a = *arr2[0];会给你10。

答案 1 :(得分:0)

作为指针数组方法的替代方法,这里有一个粗略的C ++ 03如何以编程方式进行此操作。哪一个更好取决于实际用例中operator[]的复杂程度,以及第二个数组的复杂程度(即需要多少额外内存,导致缓存未命中等)。

#include <iostream>

class c_array_view  {
public:
    c_array_view(int *array) : array_(array) {}
    int& operator[](size_t index) { return array_[index*2]; }

    static size_t convert_length(size_t original) { return original / 2; }

private:
    int *array_;
};

int main()
{
    int arr[] = {0,1,2,3,4,5,6,7,8,9};
    size_t arr_len = sizeof arr / sizeof arr[0];

    c_array_view arr2(arr);
    size_t arr2_len = arr2.convert_length(arr_len);

    for(unsigned i = 0; i < arr_len; ++i) {
        std::cout << "arr: " << i << " = " << arr[i] << std::endl;
    }
    std::cout << std::endl;

    for(unsigned j = 0; j < arr2_len; ++j) {
        std::cout << "arr2: " << j << " = " << arr2[j] << std::endl;
    }
    std::cout << std::endl;

    arr2[2] = 42;
    std::cout << "modifeid arr2[2] to 42, now arr[4] = " << arr[4] << std::endl;

    return 0;
}

c_array_view可以变成一个模板,一个很好的通用类,它将映射函数作为C ++ 11 lambda等,这只是演示了原理。

答案 2 :(得分:-2)

如果你想要正方形,那么你不应该做arr2 [j] = arr [i]。正确的答案是

arr2[j]=arr[i]*arr[i];