将含三个int成员的结构体作为std::map key时如何重载<运算符
三个int成员结构体作为std::map key的<运算符重载方案
和双成员结构体的重载逻辑一脉相承,只需要按照你需要的排序优先级逐层比较三个成员,保证比较规则符合严格弱序(std::map对key比较的强制要求)即可。
原生写法(和你现有写法风格完全统一)
假设你的结构体三个成员为x、y、z,排序优先级为x > y > z,实现如下:
bool operator < (const CacheKey& a, const CacheKey& b) { // 先比较第一优先级成员x if (a.x != b.x) return a.x < b.x; // x相等时比较第二优先级成员y if (a.y != b.y) return a.y < b.y; // x、y都相等时比较第三优先级成员z return a.z < b.z; }
上述逻辑也可以写为你熟悉的短路表达式格式:
bool operator < (const CacheKey& a, const CacheKey& b) { return a.x < b.x || (a.x == b.x && a.y < b.y) || (a.x == b.x && a.y == b.y && a.z < b.z); }
更简洁的C++11及以上版本写法
可以直接用std::tie把成员打包为tuple,tuple的默认比较规则就是符合严格弱序的字典序,写法更简洁且不容易写错分支:
#include <tuple> bool operator < (const CacheKey& a, const CacheKey& b) { return std::tie(a.x, a.y, a.z) < std::tie(b.x, b.y, b.z); }
注意事项
- 成员的比较顺序就是你的排序优先级,需要先排序的字段放在比较逻辑的最前面即可
- 不要在比较逻辑中混用
>=、>等运算符,也不要漏掉相等的分支判断,否则会破坏严格弱序规则,导致map的插入、查找等逻辑出现异常
内容的提问来源于stack exchange,提问作者samofoz
相关产品推荐
相关产品推荐

