假设我有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];
因为这就是我的代码设置方式。 而且操作是低负荷的。
答案 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];
当你需要访问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];