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日

悬赏问题

  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?