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
相关产品推荐
相关产品推荐

