li-heng 2023-01-31 22:18 采纳率: 80.8%
浏览 112
已结题

C++代码优化,复杂度太高,无法通过clang-tidy检查,用什么办法可以优=化

我看到一段代码是使用C++写的,switch + for,如下

enum class MO { A = 0, B, C};
int test(MO m) {
    switch (m) {
        case MO::A:
            for (int i = 0; i < 10; i++) {
                for (int y = 0; y < 10; y++) {
                    //TODO
                }
            }
            if(xxxx){
                return -1;
            }
            for (int i = 0; i < 10; i++) {
                for (int y = 0; y < 10; y++) {
                    //TODO
                }
            }
            break;
        case MO::B:
            for (int i = 0; i < 10; i++) {
                for (int y = 0; y < 10; y++) {
                    //TODO
                }
            }
            if(xxxx){
                return -1;
            }
            for (int i = 0; i < 10; i++) {
                for (int y = 0; y < 10; y++) {
                    //TODO
                }
            }
            break;
        case MO::C:
            for (int i = 0; i < 10; i++) {
                for (int y = 0; y < 10; y++) {
                    //TODO
                }
            }
            if(xxxx){
                return -1;
            }
            for (int i = 0; i < 10; i++) {
                for (int y = 0; y < 10; y++) {
                    //TODO
                }
            }
            break;
        default:
            break;
    }
    return 0;
}
int main() {
    test(MO::A);
    return 0;
}

里面有switch,也有双层for,大概结构如上,模拟的伪代码,这样的代码 有没有什么办法优化,它的复杂度太高
导入clang-tidy检查无法通过。用什么办法优化,补充,每个for循环次数里面的内容是不相同的,另外,每个case是两个"双层for",两个“双层for”之间有return函数的语句。

  • 写回答

5条回答 默认 最新

  • loving_hoping 2023-02-01 09:59
    关注
    
    for (int i = 0; i < 10; i++) {
                    for (int y = 0; y < 10; y++) {
                        //TODO 1
                    }
                }
                for (int i = 0; i < 10; i++) {
                    for (int y = 0; y < 10; y++) {
                        //TODO 2
                    }
                }
    

    这样的代码,在case A, B ,C里都有,
    如果case A, B, C三个里面的TODO差异比较大的话,可以分开抽成函数,如果差异比较小,那就弄成一个

    差异大:

    enum class MO { A = 0, B, C};
    void proc_A1() {
                //TODO 1
    }
    void proc_A2() {
                //TODO 2
    }
    void proc_B1() {
                //TODO 1
    }
    void proc_B2() {
                //TODO 2
    }
    void proc_C1() {
                //TODO 1
    }
    void proc_C2() {
                //TODO 2
    }
    int test(MO m) {
        for (int i = 0; i < 10; i++) {
            for (int y = 0; y < 10; y++) {
                switch (m) {
                    case MO::A:
                        proc_A1();
                        break;
                    case MO::B:
                        proc_B1();
                        break;
                    case MO::C:
                        proc_C1();
                        break;
                    default:
                        break;
                }
            }
        }
        for (int i = 0; i < 10; i++) {
            for (int y = 0; y < 10; y++) {
                switch (m) {
                    case MO::A:
                        proc_A2();
                        break;
                    case MO::B:
                        proc_B2();
                        break;
                    case MO::C:
                        proc_C2();
                        break;
                    default:
                        break;
                }
            }
        }
        return 0;
    }
    int main() {
        test(MO::A);
        return 0;
    }
    
    

    差异小:

    enum class MO { A = 0, B, C};
    void proc_member1(int i) {
        // TODO 1:
    }
    void proc_member2(int i) {
        // TODO 2:
    }
    
    int test(MO m) {
    
        for (int i = 0; i < 10; i++) {
            for (int y = 0; y < 10; y++) {
                 proc_member1(m)
        }
    
        for (int i = 0; i < 10; i++) {
            for (int y = 0; y < 10; y++) {
                 proc_member2(m)
        }
    
        return 0;
    }
    int main() {
        test(MO::A);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 已采纳回答 2月1日
  • 修改了问题 2月1日
  • 创建了问题 1月31日

悬赏问题

  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本