Создание векторной <int>ссылки на указатель целочисленного массива (C ++) - PullRequest
0 голосов
/ 26 октября 2019

Моя цель - взять 3 стандартных целочисленных массива и использовать векторные методы для их манипулирования, не копируя все элементы массива в отдельный векторный массив.

Причина, по которой я хочу сделать это без копирования элементов массивапотому что это будут очень большие массивы и эффективность является приоритетом.

Вот два примера того, как я хотел бы, чтобы это выглядело:

  1. Простейший пример:
int arr[10000];
int *ptr;
std::vector<int> & v = ptr;
v.push_back(10);
Пример функции:
// Function that inputs 3 integer arrays and creates pointers to them.
void use_vector(int *dst, int *src1, int *src2) {

  //creates vector references (without copying the original array elements)
  std::vector<int> & v_dst = dst;
  std::vector<int> & v_src1 = src1;
  std::vector<int> & v_src2 = src2;

  // do something using vector methods:
  v_dst.push_back( v_scr1.size() + v_scr2.size() );
}

В обоих случаях я получаю это сообщение об ошибке:

error: invalid initialization of reference of type ‘std::vector<int>&’ from expression of type ‘int*’
   std::vector<int> &v = ptr;

В идеале векторы являются ссылками (std :: vector &),но они также могут быть указателями (std :: vector *), если ссылки невозможны.

Ответы [ 2 ]

4 голосов
/ 26 октября 2019

Вы не можете сделать это, потому что std::vector разработан с семантикой владения данными, которые он содержит.

Это означает, что он не предназначен для переноса массива значений и его хранения. Он должен владеть данными, поэтому необходима копия (или переход с другого std::vector).

2 голосов
/ 26 октября 2019

Вы не можете делать ничего подобного:

std::vector<int> & v = ptr;

, потому что левая сторона является ссылкой на std::vector<int>, а правая сторона - указателем на int.

Аналогично для вашего второго примера.

Также вы в принципе не можете использовать std::vector для существующего массива на месте. Обычный способ - это копировать, что вы говорите, что не хотите делать. Вы слева от определения своего class дадите вам векторный интерфейс, который вам нужен для массива на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...