我有数组A[9]= {1,2,3,4,5,6,7,8,9}
,我需要删除不除以2的数字。我试过的代码:
int main()
{
int n;
ifstream fd(Cdf);
fd>>n; // read how many numbers are in the file.
int A[n];
for(int i = 0; i < n; i++)
{
fd >> A[i]; //read the numbers from file
}
for(int i = 0; i < n; i ++) // moving the numbers.
{
if(A[i] % 2 !=0)
{
for(int j = i; j < n; j++)
{
A[i] = A[i+1];
}
}
}
fd.close();
return 0;
}
但我得到像224466888
这样的数字。我需要做些什么来获得2,4,6,8?
我需要删除同一个数组中的数字。
答案 0 :(得分:2)
首先,您应该将std :: vector用于动态大小的数组。 其次,为了删除偶数在向量中的数字,你可以这样做:
std::vector<int> inf = {12,0,5,6,8};
auto func = [](int i){return i % 2 != 0;};
inf.erase(std::remove_if(inf.begin(),inf.end(),func), inf.end());
编辑:
好的,所以你仍然可以在没有std :: vectors的情况下做到这一点,但它会更加丑陋:
#include <algorithm>
int res[] = {2,5,9,8,6,7};
int size = 6;
auto func = [](int i){return i % 2 != 0;};
int new_size = std::remove_if(res,res + size, func) - res;
您想要的所有数据都在[0,new_size [范围内,数组的其他部分现在是垃圾。
答案 1 :(得分:0)
数组不能用于您的目的。它在堆栈上分配,其大小不能动态更改(通常不能更改数组的大小,不仅仅是在堆栈上分配时)。
您可以分配第二个数组,并在每次添加新元素时使用realloc
重新分配它,但这不是执行此操作的好方法。您正在使用C ++,因此只需使用std::vector<int>
即可解决您的问题:
std::vector<int> evenArray;
evenArray.reserve(sizeof(A)/sizeof(A[0])/2);
if (number is even) {
evenArray.pushBack(number);
}
请注意,向量会连续存储元素,因此这是合法的:
int *evenA = &evenArray[0];
答案 2 :(得分:0)
对于内部for
循环,您应该引用j
,而不是i
。
for(int j = i; j < n - 1; j++)
{
A[j] = A[j+1];
}
否则,创建j
的重点是什么?
当然,这也意味着如果你读回整个数组,你将显示所有被移位的字符(这将等于最后一个数字)。所以,你应该跟踪数组的新长度,然后迭代到那个而不是数组的末尾。
编辑:
在内部for
循环中,您需要循环到n - 1
,否则当您有A[j + 1]
时,它会在您更改它时从数组的末尾开始,这可能会也可能不会给您运行时错误。
答案 3 :(得分:0)
您的删除循环使用错误的变量进行索引:
for(int j = i; j < n; j++)
{
A[i] = A[i+1];
}
您正在使用i
,这在循环中不会发生变化。
将其更改为j
。您还需要从上限中减去一个,因为您在访问A[j + 1]
时会走出数组,否则会访问for(int j = i; j < n - 1; j++)
{
A[j] = A[j + 1];
}
。
{{1}}