从数组中删除指定的值

Removing a specified value from array

本文关键字:删除 数组      更新时间:2023-10-16

我正在尝试创建一个函数,该函数会将元素从一个数组复制到另一个数组,除非提到指定的变量,在这种情况下,它不会被复制。然后,该函数将输出不包含指定变量的新数组。

int *NewArray(int array[], int len, int num){
    int *array2 = new int[len];
    int temp;
    for(int i=0;i<len;i++){
        temp = array[i];
        if(temp != num){
            array2[i]=temp;
        }
        else{
            array2[i] = array[i+1];
        }
    }
    return array2;
}

for循环的问题在于它只使用一个索引来访问两个数组。您需要两个索引。

假设您要删除的项目位于索引 1 处。之后,您需要确保

array2[i] = array[i+1];

即使您有这样的行,也仅用于匹配项。它不会将该逻辑用于后续项。

这是您需要的:

for(int i=0, j = 0; i<len; ++j ){
   if(num == array[j]){
      ++j;
      // Don't increment i, increment j
      // to skip the element from array
   }
   else {
      array2[i] = array[j];
      // Increment i since it is being assigned a value from array.
      ++i;
   }
}
您可以使用

std::copy_if如下:

int *NewArray(int array[], int &len, int num) {
  int *array2 = new int[len];
  auto it = std::copy_if(array, array + len, array2, 
                         [&num](int const i){ return i != num; });
  len = std::distance(array2, it);
  return array2;
}

现场演示

使用类似 std::vector 的东西在你的情况下是有益的,但鉴于你可能有一个使用数组的正当理由,你正在以比需要的更复杂的方式进行它。这绝对是更像c式的语法,但我认为它可以执行您想要它执行的操作,而无需真正进入任何STL库。

#include <iostream>
#include <cstdlib>
int *NewArray(const int const array1[], const size_t len, const int num, size_t *newlen) {
    int *array2 = new int[len];
    size_t counter = 0;
    for (int i = 0; i < len; i++)
        if (array1[i] != num)
            array2[counter++] = array1[i];
    *newlen = counter;
    return array2;
}
int main(int argc, char **argv) {
    int arr1[] = { 1, 2, 3, 4, 5, 6, 7};
    size_t oldlen = sizeof arr1 / sizeof(int);
    size_t newlen;
    int *arr2 = NewArray(arr1, sizeof arr1 / sizeof(int), 3, &newlen);
    int i;
    for (i = 0; i < newlen; ++i)
        std::cout << arr2[i] << std::endl;
    delete arr2;
    system("pause");
}

这是我使用向量的方法。

std::vector<int> NewVector(const std::vector<int> const vec1, const int num) {
    std::vector<int> vec2 (vec1.size());
    auto it = std::copy_if(
        vec1.begin(),                       // where to start
        vec1.end(),                         // where to end
        vec2.begin(),                       // where to insert
        [&num](const int i) { return i != num; }    // lambda predicate
    );
    vec2.resize(std::distance(vec2.begin(), it));
    return vec2;
}