在给定if条件的情况下,如何删除整数数组中的特定元素?

时间:2015-12-29 08:22:04

标签: c++ arrays

我试图删除与特定情况匹配的数组的所有元素。 例如......

  

如果(AR [I] == 0)

     

删除数组中<0>的所有元素

     

删除后删除剩余数组的元素数

我尝试了什么:

  

if(ar [i] == 0)

   {
       x++;
  }
   b=N-x;

   cout<<b<<endl;

只有当我想每次都删除一个元素时,这才有效,我无法弄清楚如何在我的必要情况下删除。 我假设我需要遍历数组并选择找到的元素的所有实例并删除所有出现的实例。 而不是增加&#39; x&#39;对于一次出现只变一次变量,是否可以在一定次数的情况下将其增加一定次数?

编辑(有人要求我粘贴我的所有代码):

int N;
cin>>N;
int ar[N];

int i=0;
while (i<N) {

    cin>>ar[i];
    i++;

}//array was created and we looped through the array, inputting each element.


int a=0;
int b=N;
cout<<b; //this is for the first case (no element is deleted)
int x=0;

i=0;                //now we need to subtract every other element from the array from this selected element.
while (i<N) {

    if (a>ar[i]) {  //we selected the smallest element.
        a=ar[i];

        }

    i=0;
    while (i<N) {
        ar[i]=ar[i]-a;
        i++;
        //this is applied to every single element.
    }

    if (ar[i]==0) //in this particular case, we need to delete the ith element. fix this step.
    {
        x++;
    }
    b=N-x;

    cout<<b<<endl;

    i++;
}


    return 0; }

整个问题在这里找到: Cut-the-sticks

6 个答案:

答案 0 :(得分:5)

您可以使用std::remove功能。

我打算写一个带有链接的示例,但链接的示例几乎是我要发布的内容,所以这里是链接中的示例:

// remove algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::remove

int main () {
    int myints[] = {10,20,30,30,20,10,10,20};      // 10 20 30 30 20 10 10 20

    // bounds of range:
    int* pbegin = myints;                          // ^
    int* pend = myints+sizeof(myints)/sizeof(int); // ^                       ^

    pend = std::remove (pbegin, pend, 20);         // 10 30 30 10 10 ?  ?  ?
                                                   // ^              ^
    std::cout << "range contains:";
    for (int* p=pbegin; p!=pend; ++p)
        std::cout << ' ' << *p;
    std::cout << '\n';

    return 0;
}

严格地说,发布的示例代码可以优化为不需要指针(特别是如果你使用任何标准容器类型,如std::vector),还有std::remove_if函数允许为更复杂的谓词逻辑传递其他参数。

但是,你提到了Cut the sticks challenge,我认为你实际上不需要使用任何删除函数(超出正常的容器/数组删除功能)。相反,您可以根据挑战中设置的条件使用类似以下代码的内容来“切割”和“删除”(即,从棒上剪下X,然后在&lt; 0时删除并打印每次传递的剪切数量):

#include <iostream>
#include <vector>

int main () {
    // this is just here to push some numbers on the vector (non-C++11)
    int arr[] = {10,20,30,30,20,10,10,20}; // 8 entries
    int arsz = sizeof(arr) / sizeof(int);
    std::vector<int> vals;
    for (int i = 0; i < arsz; ++i) { vals.push_back(arr[i]); }
    std::vector<int>::iterator beg = vals.begin();
    unsigned int cut_len = 2;
    unsigned int cut = 0;
    std::cout << cut_len << std::endl;
    while (vals.size() > 0) {
        cut = 0;
        beg = vals.begin();
        while (beg != vals.end()) {
            *beg -= cut_len;
            if (*beg <= 0) {
                vals.erase(beg--);
                ++cut;
            }
            ++beg;
        }
        std::cout << cut << std::endl;
    }
    return 0;
}

希望可以提供帮助。

答案 1 :(得分:0)

如果你没有空间限制,试试类似的东西,

  1. 允许数组为A,数字为number
  2. 创建一个新数组B
  3. 遍历完整A并仅在A[i]
  4. 时将元素B[j]添加到A[i] != number
  5. B分配给A
  6. 现在A没有number元素,有效大小为j。

答案 2 :(得分:0)

检查一下:

#define N 5

int main()
{
    int ar[N] = {0,1,2,1,0};
    int tar[N];
    int keyEle = 0;

    int newN = 0;
    for(int i=0;i<N;i++){
        if (ar[i] != keyEle) {
            tar[newN] = ar[i];
            newN++;
        }
    }

    cout<<"Elements after deleteing key element 0: ";
    for(int i=0;i<newN;i++){
        ar[i] = tar[i];
        cout << ar[i]<<"\t" ;
    }

}

答案 3 :(得分:0)

除非需要使用普通的int数组,否则我建议使用std :: vector或std :: array,然后使用std :: remove_if。请参阅similar

未经测试的示例(使用c ++ 11 lambda):

#include <algorithm>
#include <vector>
// ...
std::vector<int> arr; 
// populate array somehow
arr.erase(
  std::remove_if(arr.begin(), arr.end()
     ,[](int x){ return (x == 0); } )
  , arr.end());

答案 4 :(得分:0)

Cut the sticks问题的解决方案:

#include <climits>
#include <iostream>
#include <vector>

using namespace std;

// Cuts the sticks by size of stick with minimum length.
void cut(vector<int> &arr) {

    // Calculate length of smallest stick.
    int min_length = INT_MAX;
    for (size_t i = 0; i < arr.size(); i++)
    {
        if (min_length > arr[i])
            min_length = arr[i];
    }

    // source_i: Index of stick in existing vector.
    // target_i: Index of same stick in new vector.
    size_t target_i = 0;
    for (size_t source_i = 0; source_i < arr.size(); source_i++)
    {
        arr[source_i] -= min_length;
        if (arr[source_i] > 0)
            arr[target_i++] = arr[source_i];
    }

    // Remove superfluous elements from the vector.
    arr.resize(target_i);
}

int main() {
    // Read the input.
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int arr_i = 0; arr_i < n; arr_i++) {
       cin >> arr[arr_i];
    }

    // Loop until vector is non-empty.
    do {
        cout << arr.size() << endl;
        cut(arr);
    } while (!arr.empty());

    return 0;
}

答案 5 :(得分:0)

只需一个循环:

如果(条件)

{

for(循环数组)

   {
      if(array[i] == 0)
         {
            array[i] = array[i+1]; // Check if array[i+1] is not 0
            print (array[i]);
         }
      else
         {
            print (array[i]);
         }
 }

}