从一个数组到另一个数组的选择性浅拷贝

Selective shallow copy from one array to another

本文关键字:数组 另一个 选择性 浅拷贝 一个      更新时间:2023-10-16

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

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包含多个贝塞尔补丁,其中一些与另一个补丁共享一条或多条边。但是我希望在动画时忽略它,否则在表面上有中断。

重要的是,复制包含像

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

因为我的代码就是这样设置的。

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

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

所以你需要通过arr2[j]= &arr[i];

设置arr2的每个元素指向arr中相应的元素

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

之后,假设你将arr[0]改为10 arr[0] = 10;,那么int a = *arr2[0];将给你10

作为指针数组方法的替代方法,这里有一个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等,这只是演示了原理。

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

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