Предполагая, что у меня есть 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.
То есть, если я зациклить и возвести в квадрат все элементы в обр
Я хочу, чтобы arr2 вывел: 0, 4, 16, 36, 64
Эти 2 массива являются частью одного и того же класса, один — моя полигональная информация, а другая часть — управляемая данными. 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 так, чтобы он указывал на соответствующий элемент в arr arr2[j]= &arr[i];
Когда вам нужно получить доступ к элементу в arr2, вы вызываете что-то вроде: int a = *arr2[j];
Позже скажем, вы измените arr [0] на 10 arr[0] = 10;
затем int a = *arr2[0];
даст вам 10.
В качестве альтернативы подходу с массивом указателей приведен пример грубого программирования на C ++ 03. Какой из них лучше, зависит от того, насколько operator[]
здесь должен быть реальный вариант использования и насколько меньше 2-й массив (т. е. сколько дополнительной памяти ему нужно, что приводит к отсутствию кэша и т. д.).
#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 и т. д., это просто демонстрирует принцип.
если вам нужны квадраты, то вам не следует делать arr2 [j] = arr [i]. Правильный ответ будет
arr2[j]=arr[i]*arr[i];