C++中如何用std::unordered_map键的枚举精准匹配多标志位?
位标志枚举作为std::unordered_map键的匹配问题
问题背景
我正在搭建以Direction枚举为键的std::unordered_map,枚举定义如下:
enum Direction : uint16_t { North = 1 << 0, East = 1 << 2, South = 1 << 3, West = 1 << 4, None = 1 << 5, };
目标是检查枚举键是否设置了至少2个、最多n个标志位。我初始化了多个unordered_map,例如groundTiles中插入了Direction::None、East、West以及East|West的键值对,但尝试访问同时设置East和West的条目时,执行:
Tile* westAndEastCapped = southEastHillTiles->at((Direction)(Direction::West | Direction::East)).at(0);
却默认匹配到East的集合。请问如何从unordered_map中选取同时设置East和West且无其他标志位的Tile?
解决方案
1. 确保精确插入目标键值对
std::unordered_map是精确匹配键的容器,East|West的整数值(1<<2 | 1<<4 = 4 + 16 = 20)和East(4)是完全不同的键,因此必须确保你已经正确插入了East|West作为键的条目:
// 示例插入方式 southEastHillTiles->emplace( (Direction)(Direction::East | Direction::West), std::vector<Tile*>{yourTileInstance1, yourTileInstance2} );
2. 验证访问时的键值正确性
可以通过打印键的底层整数值,确认你访问的键确实是East|West:
Direction targetKey = (Direction)(Direction::East | Direction::West); // 输出应为20 std::cout << "Target key value: " << static_cast<uint16_t>(targetKey) << std::endl;
如果输出不是20,说明你的键计算逻辑有误。
3. 检查哈希与相等谓词
默认情况下,std::unordered_map会使用枚举底层整数类型的哈希函数,只要你没有自定义错误的哈希或相等判断逻辑,就不会出现匹配错误。如果自定义了哈希函数,确保它是基于枚举的整数值计算的:
// 正确的自定义哈希示例(如果需要) struct DirectionHash { std::size_t operator()(Direction d) const { return std::hash<uint16_t>()(static_cast<uint16_t>(d)); } }; // 使用自定义哈希的unordered_map声明 std::unordered_map<Direction, std::vector<Tile*>, DirectionHash> southEastHillTiles;
4. 区分精确匹配与包含匹配
如果你的需求是键包含East和West(允许其他标志位),而非“仅包含East和West”,则需要遍历容器筛选符合条件的键:
std::vector<Tile*> result; const Direction requiredFlags = Direction::East | Direction::West; for (const auto& pair : *southEastHillTiles) { // 检查键是否包含所有requiredFlags,且无其他标志位 if ((pair.first & requiredFlags) == requiredFlags && (pair.first & ~requiredFlags) == 0) { result = pair.second; break; } }
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

