Как удалить последний элемент из массива с указателями в C ++? - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь построить функцию, которая удаляет последний элемент массива. Поэтому мне нужен входной массив и его размер, затем удалите последний член и получите новый выходной массив. Я не хочу этого Моя цель - каким-то образом сделать выходной массив новым входным массивом. Другими словами, я хочу перезаписать входной массив выходным массивом.

Так что, если размерность равна 4, я не хочу иметь массив 4-dim в памяти, а только таблицу с 3-dim после удаления.

void del (int* ptr_array, int dim) {
 int* temp = ptr_array; //Hold the very first address of the input array.
 ptr_array = new int[dim - 1]; // Let the address of the input array be 
                               // the address of new output array. Overwritting.

 for (int i = 0; i < dim - 1; i++) {
     ptr_array = (temp+i); // Will it remember what is temp+1 if I have 
                           // already overwritten the arrays?
     ptr_array++;
 }
 //delete[] ptr_array; - this one is out of the questions - deletes now the input table.
}

Можете ли вы сказать мне, что не так с этим кодом? - на самом деле это ничего не меняет

1 Ответ

3 голосов
/ 23 мая 2019

в вашей функции

 for (int i = 0; i < dim - 1; i++) {
     ptr_array = (temp+i); // Will it remember what is temp+1 if I have 
                           // already overwritten the arrays?
     ptr_array++;
 }

ничего не делает, ты хотел

 for (int i = 0; i < dim - 1; i++) {
   ptr_array[i] = temp[i];
 }

Обратите внимание, что delete в вашем комментарии недействителен, потому что вы не удаляете результат нового [], а указатель внутри выделенного массива

Если звонок как

int * v = ...;

del(v);

// here v is unchanged

возможно, вы хотели изменить v , в этом случае вы можете вернуть новый массив или использовать переменную ввода-вывода, используя ссылку

Первая возможность:

int* del (int* ptr_array, int dim) {
  int* new_array = new int[dim - 1]; 

  for (int i = 0; i < dim - 1; i++) {
     new_array[i] = ptr_array[i];
  }
  delete[] ptr_array;
  return new_array;
}

с

int * v = ...;

v = del(v);

Вторая возможность

void del (int*& ptr_array, int dim) {
  int* new_array = new int[dim - 1]; 

  for (int i = 0; i < dim - 1; i++) {
     new_array[i] = ptr_array[i];
  }
  delete[] ptr_array;
  ptr_array = new_array;
}

с

int * v = ...;

del(v);
// here v is the new array

Предупреждение: эти коды предполагают, что входной массив содержит хотя бы один элемент


Однако использование std::vector<int> делает все это за вас и более практично в использовании

std::vector<int> v;
...
v.resize(v.size() - 1);

или

std::vector<int> v;
...
v.pop_back();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...