首页 > 解决方案 > 使用 void 函数增加 C++ 中的变量

问题描述

我想让我的代码更简洁,所以我写了这个:

while(m <= r) 
    nums[m] ? nums[m] == 1 ? m++ : swap(nums[m], nums[r--]) : swap(nums[m++], nums[l++]);

但它不起作用,因为 'swap' 是一个 void 函数,但 'm++' 返回 int。(“? 的右操作数为 void,但左操作数的类型为 int”错误)。所以我想知道如何替换 m++,所以它是 void 类型。

我知道我可以创建一个新的 void 函数(例如 void increase(int &x){x++;}),但我想将我的代码保留为单行。

我制作的最佳工作变体是“swap(nums[m], nums[m++])”,它对我的​​数组没有任何作用,但看起来很糟糕。我还可以使用哪些其他功能?

标签: c++

解决方案


我想让我的代码更简洁

将许多副作用烘焙到嵌套非括号三元运算符的单个表达式中(使用隐式转换为 bool)确实会使您的代码更复杂,更容易出错,并且可能隐藏原来的事实代码实际上应该被分解并重新分解成更简单的东西。

为什么不偏爱清晰而不是过于复杂的简洁呢?例如,从直接的方法开始:

while(m <= r) {
    if (nums[m] != 0) {
        if (nums[m] == 1) {
            ++m;
        }
        else {
            swap(nums[m], nums[r--]); 
        }
    }
    else {
        swap(nums[m++], nums[l++]);
    }
}

可以重新分解为:

while(m <= r) {
    if (nums[m] != 0) {
        if (nums[m] == 1) {
            ++m;
        }
        else {
            swap(nums[m], nums[r]); 
            --r;
        }
    }
    else {
        swap(nums[m], nums[l]);
        ++m;
        ++l;
    }
}

可以重新分解为:

while(m <= r) {
    const std::size_t swap_from_idx = m;
    std::size_t swap_with_idx = m;  // default: no swapping.

    if (nums[m] == 1) {
        ++m;
        continue;
    }
    else if (nums[m] == 0) {
        swap_with_idx = l;
        ++l;
    }
    else {
        swap_with_idx = r;
        --r;
        ++m;
    }
    swap(nums[swap_from_idx], nums[swap_with_idx]);
}

或例如:

while(m <= r) {
    // No swapping.
    if (nums[m] == 1) {
        ++m;
    }
    // Swapping.
    else {
        const std::size_t swap_from_idx = m;
        std::size_t swap_with_idx = l;
        
        if (nums[m] == 0) {
            ++l;
        }
        else {
            swap_with_idx = r;
            --r;
            ++m;
        }
        swap(nums[swap_from_idx], nums[swap_with_idx]);
    }
}

此时您可能会问自己,原始循环设计是否过于复杂,和/或是否应该将循环体的一部分分解为单独的实用函数。


if//如果你的逻辑达到了太高的圈复杂度else ifelse答案很少尝试通过高度复杂的三元运算符表达式来隐藏它,而是通过重构,如果适用,将某些部分分解为单独的函数.


推荐阅读