从一个数组到另一个数组的选择性浅拷贝
Selective shallow copy from one array to another
假设我有两个不同大小的数组,即
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中的元素时,你可以调用: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];
- 在c++中为double类型的数组创建一个unique_ptr
- 从数组构造一个跨度<shared_ptr<T>><shared_ptr<void>>
- 给定一个单词数组和一个字符串,如何计算给定字符串中的所有单词
- 如何将 v8::FunctionCallbackInfo<v8::Value> 数组从一个隔离复制到另一个隔离?
- 我怎么能有一个以2D数组为参数的函数,而数组有一个我想更改的参数/维度
- 为什么我的数组输出一个不在其中的元素
- 数组 - 最后一个索引
- 将数组作为一个参数从一个函数传递到C 中的另一个函数
- 从字符串数组创建一个字符数组
- 如何在C 中的小写中将文本从数组的一个维度传递到另一个维度
- 在对结构数组的一个成员进行排序后,移动其成员的其余部分
- 为什么数组在一个文件中打印,但在发送到另一个文件时却缺少数字
- C++,为什么多维数组的一个元素的增加似乎增加了另一个元素
- 将数组的一个元素与整个数组元素进行比较
- 如何将数组从一个函数传递到另一个函数
- 查找最大和连续子数组-另一个版本
- 使用for循环将char数组的一个元素复制到另一个元素
- C++如何将变量char数组从一个函数传递到另一个函数
- 数组 ->另一个空的 int 数组混淆
- 用另一个字符数组替换一个字符数组