li-heng 2023-01-31 22:18 采纳率: 81.5%
浏览 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 NeRF的代码复现以及人工智能入门
  • ¥15 centos如何做一个可以让ikuai连接的openvpn
  • ¥15 Protege 中的Entities下面的界面删除了如何复原
  • ¥15 scrapy爬虫求帮
  • ¥15 imageEnView绘图问题
  • ¥15 关于#python#的问题:您好可以加您一下联系方式吗,在复现的时候确实有点问题难以解决
  • ¥15 联想电脑重装系统时无法发现硬盘
  • ¥15 MATLAB与UR10e实体机械臂建立通讯
  • ¥15 c++题需要快一点不用opencv
  • ¥15 关于#java#的问题:想要咨询Flowable流程引擎框架的问题