在C ++中删除数组中所有出现的数字

时间:2018-01-21 01:48:21

标签: c++

假设我们传入了数组{1,2,3,1,2,3,1},我们想要     删除所有出现的数字3.结果数组将是     {1,2,1,2,1},返回值为5,因为现在有     数组中只有5个项目。 此功能有误。我不知道如何删除事件。我知道我的索引保存了事件的位置。所以我需要从我的数组中删除那些位置。 HELP !! 我只能使用数组,我不能使用向量或指针。

void test() {

    int data[] = { 2, 1, 3, 2, 5, 2, 7, 8, 4, 9 };
    int length = 10;
    int x = 2;
    int index = 0;
    int counter =0;


    int tempIndex = 0;
    int finalLength = 0;
    for (int i = 0; i < length; i++)
    {
        if (x != data[i]) {

            tempIndex = i;
            counter++;
            cout << "Array: " << tempIndex << endl;
        }
    }
    cout << "Size: " << counter << endl;
}

3 个答案:

答案 0 :(得分:2)

您可以使用C ++中提供的std :: remove函数,您可以执行以下操作

int data[] = { 2, 1, 3, 2, 5, 2, 7, 8, 4, 9 };
int length = 10;
int* pbegin = myints; 
int* pend = data+sizeof(data)/sizeof(int);                     

pend = std::remove (pbegin, pend, 3);    
for (int* p=pbegin; p!=pend; ++p)
   std::cout << *p;

答案 1 :(得分:1)

您无法在不创建新阵列的情况下调整C样式阵列的大小。这是固定的。如果您正在寻找计算特定元素的出现次数并跟踪新数据的总和,那么您可以简单地执行

void test() {

    int data[] = { 2, 1, 3, 2, 5, 2, 7, 8, 4, 9 };
    int length = 10;
    int x = 2;
    //int index =0;
    int sum(0);

    int counter = 0;
    for (int i = 0; i < length; i++) {
        if (x == data[i]) {
            //index = i;
            //--counter; //return # of ocurrences in array
            //cout << "Position of ocurrences: " << index << endl;
            ++counter;
        }else{
            sum += data[i];
        }
    }
    //for (int a = counter; a < length; a++) {
        //data[a] = data[a + 1];
        //cout <<"testing"<< data[a];
    //}

    cout << "Number of ocurences: " << counter << " sum: " << sum << endl;
}

另一种方法是将重复元素赋值为零,但这不会调整数组大小,而是消除重复元素。这是一种解决方法,但它会修改原始数据。

答案 2 :(得分:1)

正如其他人已经说过的那样,直到他们面对蓝色(可能),你不能调整数组的大小。内存是固定的。您可以做的是跟踪您要“移除”的匹配元素,并移动其余元素以使其看起来已被删除。实际情况是内存中的数组仍然是您开始使用的大小,但您可以使用“新”数组的计算大小打印结果。

以下代码应该做你想要的。第一个参数是您的数据数组,下一个参数将是所述数组的固定大小。最后一个参数是您要“删除”所有出现的数字。函数remove_match将返回数据数组的大小减去它找到的任何匹配项。如果要使用返回值打印结果数组,则只会移动数组,以便只显示不匹配的元素,因为它是新的大小。

int remove_match(int array[], int length, int match)
{
    size_t shift(0);
    int removed(0);

    for (size_t i = 0; i < length; ++i)
    {
        if (array[i] == match)
        {
            removed++;
        }
        else
        {
            array[shift++] = array[i];
        }
    }
    return (length - removed);
}

您可以像这样调用此函数,例如

int match = 2;
int data[] = { 2, 1, 3, 2, 5, 2, 7, 8, 4, 9 };
int length = 10;

int newLength = remove_match(data, length, match);

// validate your results
for(int i = 0; i < newLength; ++i)
{
    std::cout << data[i] << " ";
}
std::cout << std::endl;