C++ C+中结构键的比较运算符+;地图表格

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

我的数据是由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) 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);
}