use*_*261 3 c++ dictionary key operator-keyword
我有由3个整数组合唯一标识的数据.
例如:
项目#1:10,20,1
项目#2:10,21,0
项目#3:0,14,13
项目#4:103,324,78
我的结构:
struct structureKeyID
{
int keyA;
int keyB;
int keyC;
// Comparison operator for table sorting.
bool operator<(const structureKeyID& param) const
{
if (keyA < param.keyA) return true;
if (keyB < param.keyB) return true;
if (keyC < param.keyC) return true;
return false;
}
};
map <structureKeyID, classDataRecord> tableRecords;
Run Code Online (Sandbox Code Playgroud)
我发现如果我添加一个键(0,0,1):
structureKeyID keyID1;
keyID1.keyA = 0;
keyID1.keyB = 0;
keyID1.keyC = 1;
tableRecords[keyID1] = <data>;
Run Code Online (Sandbox Code Playgroud)
然后我检查密钥(0,1,0)是否存在:
structureKeyID keyID2;
keyID1.keyA = 0;
keyID1.keyB = 1;
keyID1.keyC = 0;
if (tableRecords.find(keyID2) != tableRecords.end())
Run Code Online (Sandbox Code Playgroud)
然后我会收到一个错误:
调试断言失败!
\include\xtree行:1268
表达式:无效的运算符
然而,如果我检查密钥(0,0,2)或密钥(10,0,2)是否存在,它可以正常工作.
为这种情况构建比较运算符的正确方法是什么?
非常感谢你!
满足严格弱排序的小于比较的最简单实现是std::tie,在<tuple>标题中可用:
bool operator<(const structureKeyID& param) const
{
return std::tie(keyA, keyB, keyC) < std::tie(param.keyA, param.keyB, param.keyC);
}
Run Code Online (Sandbox Code Playgroud)
这进行了字典比较.如果您没有C++ 11支持,可以在TR1和Boost中找到等价物.
试试这个
// Comparison operator for table sorting.
bool operator<(const structureKeyID& param) const
{
if (keyA < param.keyA) return true;
if (keyA > param.keyA) return false;
if (keyB < param.keyB) return true;
if (keyB > param.keyB) return false;
if (keyC < param.keyC) return true;
if (keyC > param.keyC) return false;
return false;
}
Run Code Online (Sandbox Code Playgroud)
您的版本没有定义一致的排序(技术术语是严格的弱排序),因为使用您的比较函数可能会有A <B <C <A,所以std::map会感到困惑.