看起来每次在阵列中连续有奇数三行。一个在中间不会被删除。我明白为什么会这样,但我不太清楚如何解决它。
这适用于C ++。
#include <iostream>
using namespace std;
void removeodd(int arr[],int& number)//{1,2,3,6,7,9,5,8};
{int count=0;
for(int i=0; i<number; i++)
{
if(arr[i]%2!=0)
{
int j=i+1;
for(int k=i;k<number; k++)
{
arr[k]=arr[j];
j++;
}
count++;
}
}
number=number-count;
for(int i=0; i<number; i++){
cout<<arr[i]<<" ";
}
}
int main(){
int size=8;
int ary[8]={1,2,3,6,7,9,5,8};
removeodd(ary, size);
return 0;
}
output of the code above is 2 6 9 8
问题是你总是推进你的索引,即使你删除了一个奇数。因此,如果有两个奇数,则删除第一个并将索引移过第二个。要解决此问题,请在删除奇数时再次减小索引。所以在此之后:
count++;
还说这个:
i--;
你得到的输出是:
2 6 8
在你的for循环..
删除值1时采用值。
在数组ary是{2,3,6,7,9,5,8}
但我的值是1,所以你没有检查值2是奇数。
所以修复循环检查所有值。
1 2 3 4
;大小是4
之后:2 4 3 4
;新的“大小”是2
(实际大小仍然是4
)removeodd
,而不是removeodd_and_display_even
。做你说的话。解决方案(live):
#include <iostream>
int removeodd(int arr[], int arrsize)
{
int di = 0; // di == destination index
for (int si = 0; si < arrsize; ++si) // si == source index
if (arr[si] % 2 == 0) // even number => copy it
arr[di++] = arr[si]; // assign arr[si] to arr[di], then increment di
return di; // "size" of new array
}
int main()
{
int size = 8;
int ary[8] = { 1,2,3,6,7,9,5,8 };
int newsize = removeodd(ary, size);
for (int i = 0; i < newsize; ++i)
std::cout << ary[i] << ' ';
return 0;
}
你使用一系列基本类型(例如int
)代替C ++容器使你自己变得困难,C ++容器包含成员函数,允许你.erase()
你的数组中的任何元素。选择vector<int>
将允许您以微不足道的方式移除奇数值。
例如,
#include <vector>
...
std::vector<int> arr {1,2,9,6,7,3,5,8};
将创建你的array
作为vector<int>
。作为矢量容器,您可以使用简单的迭代器简单地迭代矢量中的每个元素,从arr.begin()
到arr.end()
。唯一需要注意的是,每次擦除后都必须重新验证迭代器,因为迭代器在容器更改时无效。要重新验证迭代器,只需指定.erase()
操作的结果,例如:
for (auto it = arr.begin(); it != arr.end();) { /* iterate vector */
if (*it & 1u) /* if value is odd */
it = arr.erase(it); /* erase it saving/revalidating iter */
else /* otherwise */
it++; /* simply advance iter */
}
将它放在一个输出原始arr
的简短示例中,删除奇数,然后再次输出arr
并删除奇数,您可以这样做:
#include <iostream>
#include <vector>
int main (void) {
std::vector<int> arr {1,2,9,6,7,3,5,8};
for (auto& v: arr) /* output original vector contents */
std::cout << " " << v;
std::cout << '\n';
for (auto it = arr.begin(); it != arr.end();) { /* iterate vector */
if (*it & 1u) /* if value is odd */
it = arr.erase(it); /* erase it saving/revalidating iter */
else /* otherwise */
it++; /* simply advance iter */
}
/* output remaining even values */
for (auto& v: arr)
std::cout << " " << v;
std::cout << '\n';
}
示例使用/输出
$ ./bin/vect_remove_odd
1 2 9 6 7 3 5 8
2 6 8
仔细看看,如果您有其他问题,请告诉我。