Arhn - архитектура программирования

С++ объединяет два массива без глубокого копирования

У меня есть два массива каждого размера 3 как:

void main() {
    double* arr1 = new double[3];
    double* arr2 = new double[3];
    for(int i = 0; i < 3; i++) {
        arr1[i] = 0;
        arr2[i] = 0;
    }
}

И у меня есть функция, которая принимает двойной массив в качестве указателя:

void func(double* arr_6D) {
   // expected arr size = 6.
   // manipulates values of arr
   for(int i = 0; i < 6; i++) {
      arr_6D[i] = 1;
   }
}

Я хочу передать функции arr1 и arr2 вместе, чтобы функция манипулировала их исходными значениями.

Как я могу это сделать?

Ниже не будет работать, так как он делает копию исходных массивов:

double *arr_merged = new double[6];
arr_merged[0] = arr1[0];
arr_merged[1] = arr1[1];
arr_merged[2] = arr1[2];
arr_merged[3] = arr2[0];
arr_merged[4] = arr2[1];
arr_merged[5] = arr2[2];
func(arr_merged);
14.08.2020

  • почему бы не использовать std::vector<double>, чтобы иметь возможность изменить размер, например, добавить новые значения и выполнить слияние? 14.08.2020
  • Передайте массивы по ссылке и назначьте их новому массиву по ссылке 14.08.2020
  • Вы не можете этого сделать. Если бы вы могли изменить сигнатуру func, чтобы она принимала ваш пользовательский тип, вы могли бы написать struct { double* first, double* second }; с перегруженным operator[], чтобы предоставить доступ к элементам обоих массивов без создания копии. 14.08.2020
  • @bruno Я не писал некоторые подробности, но функция «func (double * arr_6D)» взята из библиотеки и исправлена. Я не могу изменить его, например, на func(std::vector‹double› &arr_6d) 14.08.2020
  • @ d4rk4ng31 Можете ли вы показать мне пример? 14.08.2020
  • @pptaszni Я не писал некоторых подробностей, но «func (double * arr_6D) взят из библиотеки и исправлен. Я не могу изменить его, например, на func(std::vector‹double› &arr_6d) 14.08.2020
  • @Joon.P, вы можете использовать std::vector<float> и указать базовый массив для своей функции, см. мой ответ 14.08.2020

Ответы:


1

вы не можете изменить размер массива, который вы создаете с помощью new double[<size>], чтобы иметь возможность выполнять слияние, поэтому для изменения размера используйте std::vector<float>, а также предлагает множество дополнительных действий

'func(double * arr_6D) взята из библиотеки и исправлена. Я не могу изменить его, например, на func(std::vector &arr_6d)

вы можете получить базовый массив, служащий хранилищем элементов, используя операцию data()

std::vector<double> arr1 = { ... }
...
std::vector<double> arr2 = { ... }
...
// concatenate arr1 with arr2
arr1.insert( arr1.end(), arr2.begin(), arr2.end() );
...
// call your func with underlying array
func(arr1.data());

предупреждение о необходимости соблюдать осторожность при манипулировании базовым массивом

14.08.2020
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..