C++需要从数组中删除某些值

C++ need to delete certain values from an array

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

我需要从数组中删除所有最小值和最大值,但我不知道如何做到这一点。

首先,我创建一个数组,例如由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循环遍历数组,如果它找到最小值或最大值,它应该删除它,但由于某种原因,它不起作用。它只删除第一个值,仅此而已。如有任何帮助,我们将不胜感激。

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

你能做的就是在元素周围移动,这样重要的值就在开头。例如,您的数组可能包含[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

p.S.array[n]格式错误,因为n不是编译时间常数。您需要动态分配数组,以便具有运行时大小。我建议使用std::vector<int>。使用vector,也可以擦除删除的元素(内存不会被释放,但std::vector::size报告了减小的大小(。

有两种方法可以实现这一点。简单的方式还是艰难的方式。简单的方法是使用std::vector<int>而不是数组,因为这样可以调整向量的大小。另一种方法是每次删除n-1大小的项时创建一个新数组,并将所有旧值复制到调整大小的数组中。

对于初学者来说,可变长度数组不是标准的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