在c ++中没有任何内置函数从数组中删除元素

时间:2017-02-07 14:00:04

标签: c++ arrays

问题是: "编写并测试以下从数组中删除项目的函数:

void removeAll(float a[], int& n, float x);

该函数删除数组前n个元素中出现的所有x,并通过删除的数字减少n的值。

我编写了一个代码,它的工作原理非常好。基本上,我使用Zero标记了用户想要删除的值,并且代码在遇到零时跳过打印。基本上我们不会从数组中删除该值,只是将其替换为其他值。如果用户在数组中输入零怎么办?那么其他零也将被跳过,我也不想要它们。我怎么能这样做?

这是我的代码:

不要在c ++中使用任何类,对象,向量,字符串或任何函数,就像js中的array.splice一样。

 #include<iostream>
using namespace std;


void removeAll(float a[], int &n, float x)
{
    for (int i = 0; i < n; i++)
    {
        if (a[i] == x)
        {
            a[i] = 0;
        }
    }
    for (int i = 0; i < 10; i++)
    {
        if (a[i]!=0)
            cout << a[i] << endl;
    }
}

int main()
{
    float a[10], x;
    int n;
    cout << "Enter values in array: \n";
    for (int i = 0; i < 10; i++)
    {
        cin >> a[i];
    }
    cout << "Enter the value whose occurrence you want to remove from the array: ";
    cin >> x;
    cout << "Enter serial no. uptill which you want to remove the occurences";
    cin >> n;
    removeAll(a, n, x);
}

2 个答案:

答案 0 :(得分:0)

如果你只是想在没有选择变量的情况下打印出数组,你可以用一个条件来完成:

void removeAll(float a[], int &n, float x)
{
    for (int i = 0; i < n; i++)
    {
        if (a[i] == x)
        {
            // Don't print it
        }
        else
        {
            cout << a[i] << endl;
        }
    }
}

如果您想消除这些事件,我建议您将以下数字向前移动。我不会对它进行编码,但这是一个例子:

array: 2,3,4,5,3,7
number to remove: 3

1. Iterate through the array and find '3'
2. If you find one, move all elements on the right side on step to left:
   2 3 4 5 3 7  => 2 4 5 3 7 X
     ^
   2 4 5 3 7 X  => 2 4 5 7 X X
         ^
3. Count how many times you have done step two and return the new length/new array

答案 1 :(得分:0)

要做到这一点,你需要做4件事:

  1. 制作n的副本以保留要迭代的元素数量:int size = n
  2. 更改循环条件以考虑此新元素而不是ni < size
  3. 每次替换嵌套n语句中的值时递减if
  4. 删除第二个for - 循环(如果您要打印n下的所有内容,但被替换的数字会在else条件下执行此操作。)