C++需要从数组中删除某些值
C++ need to delete certain values from an array
我需要从数组中删除所有最小值和最大值,但我不知道如何做到这一点。
首先,我创建一个数组,例如由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::remove
和std::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
- 你能帮我解决删除数组 c++ 中重复值的挑战吗?
- 删除[i] 数组和删除数组 [i] 之间的区别
- 如何实现删除数组的功能?
- 删除数组 c++ 崩溃问题
- 如何删除数组列表中的元素
- C++删除数组只会解除分配第一项
- 删除数组成员的更好方法是什么?
- 如何使用 deleteEntry 函数 c++ 删除数组中的单个字符串
- 删除数组中所有出现的数字 C++
- C++ 删除数组时检测到堆损坏
- 不允许删除数组的一部分,为什么
- 如何删除数组中第一次出现的值
- 当我删除数组时,指针在哪里?指向数组的指针与数组中的元素之间的区别
- 尝试用C 中的空地址(而非null)删除数组指针
- 为什么 std::remove 不删除数组的最后一个元素
- 如何使用c++删除数组中的一些值
- 仅删除数组的第一个元素
- 删除数组时断言失败
- 如何并行删除数组中的零值
- 访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组