C ++:使用循环

时间:2015-11-29 14:55:16

标签: c++ arrays conditional-statements

我有以下代码:

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.

任何想法来自何处?

由于

2 个答案:

答案 0 :(得分:1)

如果size表示数组中的元素数,则为

a2[size-b] = arr[y];

超过b = 0时的尺寸。 所以,你将值分配给一个元素太远了。

答案 1 :(得分:0)

有很多问题。

  1. 只需使用std::partionstd::partion_copy代替。然后,您可以使用std::distance来计算“好”元素的数量,方法是使用partition的返回值。无需重新发明轮子。
  2. 只需使用else分支而不是else if,您就会不必要地进行两次检查。
  3. 您既不会增加a也不会增加b。您应该将a重命名为count_good,将b重命名为count_bad
  4. 您需要致电a2[size-count_bad - 1],否则您只需访问a2[size]即可获得一次错误。
  5. C ++不允许使用动态数组。由于编译size时未知int a2[size];,因此不符合要求。请改用std::vector