【问题标题】:C++ need to delete certain values from an arrayC++需要从数组中删除某些值
【发布时间】:2019-11-16 02:05:55
【问题描述】:

我需要从数组中删除所有最小值和最大值,但我不知道该怎么做。

首先我创建一个数组,例如,由 5 个数字组成。然后我输入数字,比如 1、2、3、4、5。然后我找到最小值和最大值,即 1 和 5,很简单。然后我需要删除它们,这就是我卡住的地方。

这里是代码:(循环倒数第二个是相关部分)

int main()
    {
        int i;
        int n;
        int min=999999;
        int max=-999999;

        cout<<"Enter how many elements there will be in the array"<<endl;
        cin>>n;

        int array[n];

        for(i=0;i<n;i++)
        {
        cout<<"Enter element "<<i+1<<endl;
        cin>>array[i];
        }

        for(i=0;i<n;i++)
        {
            if(array[i]<min)
            {
                min=array[i];
            }
            if(array[i]>max)
            {
                max=array[i];
            }
        }

        for(i=0;i<n-1;i++)
        {

            if(array[i]==min||array[i]==max)
            {
                for(i=0;i<n-1;i++)
                {
                array[i]=array[i+1];
                }
                array[n-1]=0;
                n--;
            }
        }
        for(i=0;i<n;i++)
                {
                    cout<<"Array after min and max values deleted: "<<array[i]<<endl;
                }

        return 0;
    }

我在想的是它应该通过一个 for 循环遍历数组,如果它找到最小值或最大值,它应该删除它,但由于某种原因它不能那样工作。它只删除第一个值,仅此而已。任何帮助将不胜感激。

【问题讨论】:

  • 使用 std::vector,而不是 C 风格的数组。使用Erase-Remove idiom
  • `int array[n];`错了,应该是int *array = new int[n];
  • 您不能删除数组中的项目。你可以覆盖它。覆盖数组中的元素不会改变数组的容量。
  • 还有for(i=0;i&lt;n-1;i++) 循环错误应该是for(k=i;k&lt;n-1;k++)
  • 这里的“k”是什么?

标签: c++ arrays


【解决方案1】:

无法从数组中删除值。数组在其整个生命周期中具有恒定数量的元素。

您可以做的是围绕元素移动,以便重要的值位于开头。例如,您的数组可能包含 [2, 3, 4, x, y] 其中 x 和 y 是一些您不关心的值。

有执行此操作的标准算法:std::removestd::remove_if。示例:

auto is_min_or_max = [=](int val) {
    return val == min
        || val == max;
};
std::remove_if(array, array + n, is_min_or_max);

此外,还有用于查找数组中的最小值和最大值的标准算法:std::minmax_element

附: array[n] 格式不正确,因为 n 不是编译时间常数。您需要动态分配数组以获得运行时大小。我推荐使用std::vector&lt;int&gt;。使用vector,也可以擦除被移除的元素(内存没有被释放,但是std::vector::size报告了减小的大小)。

【讨论】:

  • 是的,这就是我所说的“删除”。也许我用词错误。我不熟悉 std::remove 和 std::remove_if,但我会尝试 Google 寻找它们如何工作的一些示例。
  • @grt.dan 我加了一个例子。
【解决方案2】:

有两种方法可以解决这个问题。简单的方法或困难的方法。简单的方法是使用 std::vector&lt;int&gt; 而不是数组,因为那时您可以调整向量的大小。另一种方法是每次删除 n-1 大小的项目时创建一个新数组,并将所有旧值复制到调整大小的数组中。

【讨论】:

  • 没有必要创建一个新数组每次删除一个项目。一次创建一个新数组就足够了
  • 没有必要在每次删除一个项目时都创建一个新数组想想std::vector是如何实现大小和容量的。这些不必相同,因此您无需在每次需要从向量中添加或删除项目时分配或释放。
【解决方案3】:

对于初学者来说,可变长度数组不是标准的 C++ 特性。

要么使用固定大小的数组,并要求用户指定不大于数组固定大小的数组大小,要么使用标准类模板std::vector

要找到数组或向量中的最小值和最大值,请使用标准算法std::minmax_element。要删除等于最小值或最大值的元素,请使用标准算法std::remove_if。您可以从数组中删除元素,但算法会将实际元素转移到数组的初学者,并返回指向最后一个实际元素之后的元素的指针。

这是一个演示程序

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>


int main() 
{
    int a[] = { 1, 2, 3, 4, 5 };

    auto minmax = std::minmax_element( std::begin( a ), std::end( a ) );

    auto it = std::remove_if( std::begin( a ), std::end( a ),
                              [&minmax]( const int &item )
                              {
                                return item == *minmax.first or item == *minmax.second;
                              } );

    size_t n = std::distance( std::begin( a ), it );

    for ( size_t i = 0; i < n; i++ )
    {
        std::cout << a[i] << ' ';
    }

    std::cout << '\n';

    std::vector<int> v;

    std::cout << "Enter how many elements there will be in the vector: ";

    size_t size;

    std::cin >> size;

    v.resize( size );

    for ( std::vector<int>::size_type i = 0; i < v.size(); i++ )
    {
        std::cout << "Enter element " << i + 1 << ": ";

        std::cin >> v[i];
    }

    auto minmax2 = std::minmax_element( std::begin( v ), std::end( v ) );

    v.erase( std::remove_if( std::begin( v ), std::end( v ),
                             [&minmax2]( const int &item )
                             {
                                return item == *minmax2.first or item == *minmax2.second; 
                             } ), std::end( v ) );

    for ( const auto &item : v )
    {
        std::cout << item << ' ';
    }

    std::cout << '\n';

    return 0;
}

它的输出可能看起来像

2 3 4 
Enter how many elements there will be in the vector: 5
Enter element 1: 1
Enter element 2: 2
Enter element 3: 3
Enter element 4: 4
Enter element 5: 5
2 3 4 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2015-03-09
    • 2016-08-15
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多