C++ C+中结构键的比较运算符+;地图表格
我的数据是由3个整数的组合唯一标识的 例如:C++ C+中结构键的比较运算符+;地图表格,c++,dictionary,key,operator-keyword,C++,Dictionary,Key,Operator Keyword,我的数据是由3个整数的组合唯一标识的 例如: 第1项:10,20,1 第2项:10,21,0 第3项:0,14,13 项目4:103324,78 我的结构: struct structureKeyID { int keyA; int keyB; int keyC; // Comparison operator for table sorting. bool operator<(const structureKeyID& param) con
第1项:10,20,1
第2项:10,21,0
第3项:0,14,13
项目4:103324,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;
然后我将得到一个错误:
调试断言失败\包括\x三行:1268
表达式:无效运算符 然而,如果我检查键(0,0,2)或键(10,0,2)是否存在,它工作正常 对于这种情况,构建比较运算符的正确方法是什么 多谢各位 试试这个
// 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;
}
//用于表排序的比较运算符。
布尔运算符参数keyA)返回false;
如果(keyBparam.keyB)返回false;
如果(keyCparam.keyC)返回false;
返回false;
}
您的版本没有定义一致的排序(技术术语是严格弱排序),因为使用比较函数可能会有一个
std::map
会被混淆。满足严格弱排序的比较差的最简单实现是使用std::tie
,可在
标题中找到:
bool operator<(const structureKeyID& param) const
{
return std::tie(keyA, keyB, keyC) < std::tie(param.keyA, param.keyB, param.keyC);
}
bool操作您可能会发现使用std::tie
的方法很有用。如果您没有c++11,那么就可以使用boost::tie
。这很有意义!3行代码,非常好用,谢谢!我在这个项目中没有可用的元组。不过,我很感谢你提供的信息,并将在未来研究这些联系。谢谢如果keyA、keyB等是浮动的,这会如何影响在地图中使用此类结构作为键的稳定性?虽然使用单个浮点作为映射键容易出错,但使用std::tie
的这种组合是否更好?
// 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;
}
bool operator<(const structureKeyID& param) const
{
return std::tie(keyA, keyB, keyC) < std::tie(param.keyA, param.keyB, param.keyC);
}