You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++循环冗余代码优化咨询:游戏场二维地图枚举判断逻辑

优化双层循环内冗余判断的几种实用方案

Great question! Those repeated checks and multiple calls to at() are definitely a good candidate for cleanup. Here are a few practical ways to optimize this code, focusing on both readability and efficiency:

1. 缓存当前格子的值,避免重复调用at()

每次调用map_.at(n-1).at(m-1)都会触发边界检查(虽然安全,但重复调用有不必要的开销),而且写多次也显得冗余。先把当前值存到临时变量里,再做判断:

bool MainClass::isTrue(int x, int y, int w, int h) {
    for (int m = y; m < h; m++) {
        for (int n = x; n < w; n++) {
            auto current = map_.at(n-1).at(m-1); // 缓存当前格子的值
            if (current == SubClass::PartOfEnum::CAR 
                || current == SubClass::PartOfEnum::BOAT 
                || current == SubClass::PartOfEnum::SHIP 
                || current == SubClass::PartOfEnum::PLANE) {
                return true; // 补全原代码未写完的返回逻辑
            }
        }
    }
    return false; // 补充默认返回值
}

2. 封装判断逻辑到辅助函数

如果这个判断逻辑在代码其他地方也会用到,或者只是想让循环内的代码更简洁,可以写一个辅助函数(成员函数或静态函数):

// 可以放在MainClass作为静态成员,或SubClass中,根据代码结构调整
static bool isTargetVehicle(SubClass::PartOfEnum val) {
    return val == SubClass::PartOfEnum::CAR 
        || val == SubClass::PartOfEnum::BOAT 
        || val == SubClass::PartOfEnum::SHIP 
        || val == SubClass::PartOfEnum::PLANE;
}

bool MainClass::isTrue(int x, int y, int w, int h) {
    for (int m = y; m < h; m++) {
        for (int n = x; n < w; n++) {
            if (isTargetVehicle(map_.at(n-1).at(m-1))) {
                return true;
            }
        }
    }
    return false;
}

3. 使用集合快速查找

如果枚举值较多,或者后续可能新增更多目标类型,用std::unordered_set(或std::set)存储目标枚举值,判断时只需一次查找操作:

bool MainClass::isTrue(int x, int y, int w, int h) {
    // 静态初始化,程序运行期间只执行一次
    static const std::unordered_set<SubClass::PartOfEnum> targetVehicles = {
        SubClass::PartOfEnum::CAR,
        SubClass::PartOfEnum::BOAT,
        SubClass::PartOfEnum::SHIP,
        SubClass::PartOfEnum::PLANE
    };

    for (int m = y; m < h; m++) {
        for (int n = x; n < w; n++) {
            if (targetVehicles.count(map_.at(n-1).at(m-1))) {
                return true;
            }
        }
    }
    return false;
}

4. 位掩码(适合枚举按位定义的场景)

如果你的枚举是按位标记设计的(每个值对应独立的二进制位),可以用位掩码实现最高效的判断:

首先调整枚举定义(如果允许修改的话):

namespace SubClass {
    enum PartOfEnum : unsigned int {
        NONE = 0,
        CAR = 1 << 0,
        BOAT = 1 << 1,
        SHIP = 1 << 2,
        PLANE = 1 << 3,
        // 其他枚举值...
    };
}

然后用位运算判断:

bool MainClass::isTrue(int x, int y, int w, int h) {
    static const unsigned int targetMask = 
        SubClass::PartOfEnum::CAR | 
        SubClass::PartOfEnum::BOAT | 
        SubClass::PartOfEnum::SHIP | 
        SubClass::PartOfEnum::PLANE;

    for (int m = y; m < h; m++) {
        for (int n = x; n < w; n++) {
            auto current = static_cast<unsigned int>(map_.at(n-1).at(m-1));
            if ((current & targetMask) != 0) {
                return true;
            }
        }
    }
    return false;
}

选择建议

  • 若只是少量枚举值,方案1或2最直接,代码简单易读;
  • 若枚举值较多或需频繁修改,方案3更灵活;
  • 若枚举本来就是按位设计的,方案4效率最高(位运算比集合查找更快)。

内容的提问来源于stack exchange,提问作者SEPS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:30:47