如何在C ++中使用指针从数组中删除最后一个元素?

时间:2019-05-23 10:11:52

标签: c++ visual-c++

我尝试构建一个删除数组最后一个元素的函数。因此,我需要一个输入数组及其尺寸,然后删除最后一项并获得一个新的输出数组。我不要我的目标是以某种方式使输出数组成为新的输入数组。换句话说,我想用输出数组覆盖输入数组。

因此,如果维数为4,我不想在内存中有一个4维数组,而删除后只希望有3维表。

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 个答案:

答案 0 :(得分:3)

发挥作用

 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 无效,因为您不删除new []的结果,而是删除分配的数组中的指针

如果通话类似

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();