我有以下代码:
size_t function(T* arr, size_t size, FUN f){
size_t a = 0;
size_t b = 0;
int a2[size];
for (int y = 0; y<size; y++){
if (f(arr[y])){
a2[0+a] = arr[y];
++count_good;
} else if (f(arr[y]) == false){
a2[size-b] = arr[y];
++count_bad;
}
}
copy(a2, a2 + sizeof(a2) / sizeof(a2[0]), arr);
return a;
}
根据条件应该安排a2:如果为true,则将值放在前面的数组中;如果函数的结果为假,则将它们放在后面。
但是,如果我设置
int arr[6]={10,3,9,6,3,2}
;
我的功能结果是
int arr[6]={10,6,2,0,3,9}
;
如您所见,其中一个值已更改为0.
任何想法来自何处?
由于
答案 0 :(得分:1)
如果size
表示数组中的元素数,则为
a2[size-b] = arr[y];
超过b = 0
时的尺寸。
所以,你将值分配给一个元素太远了。
答案 1 :(得分:0)
有很多问题。
std::partion
或std::partion_copy
代替。然后,您可以使用std::distance
来计算“好”元素的数量,方法是使用partition
的返回值。无需重新发明轮子。else
分支而不是else if
,您就会不必要地进行两次检查。a
也不会增加b
。您应该将a
重命名为count_good
,将b
重命名为count_bad
。a2[size-count_bad - 1]
,否则您只需访问a2[size]
即可获得一次错误。size
时未知int a2[size];
,因此不符合要求。请改用std::vector
。