Выборочная мелкая копия из одного массива в другой

Предполагая, что у меня есть 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];

потому что так настроен мой код.
И что операция будет с низкой нагрузкой.

6

Решение

Для этого вам понадобится массив целочисленных указателей.

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.

6

Другие решения

В качестве альтернативы подходу с массивом указателей приведен пример грубого программирования на 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 и т. д., это просто демонстрирует принцип.

0

если вам нужны квадраты, то вам не следует делать arr2 [j] = arr [i]. Правильный ответ будет

arr2[j]=arr[i]*arr[i];
-2
По вопросам рекламы [email protected]