C ++映射表中结构键的比较运算符

时间:2013-05-03 15:14:23

标签: 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;

我发现如果我添加一个键(0,0,1):

structureKeyID keyID1;
keyID1.keyA = 0;
keyID1.keyB = 0;
keyID1.keyC = 1;
tableRecords[keyID1] = <data>;
然后我检查密钥(0,1,0)是否存在:

structureKeyID keyID2;
keyID1.keyA = 0;
keyID1.keyB = 1;
keyID1.keyC = 0;
if (tableRecords.find(keyID2) != tableRecords.end())

然后我会收到错误:

  

Debug Assertion失败!
  \ include \ xtree线:1268
  表达式:无效的运算符

然而,如果我检查密钥(0,0,2)或密钥(10,0,2)是否存在,它可以正常工作。

为这种情况构建比较运算符的正确方法是什么?

非常感谢!

2 个答案:

答案 0 :(得分:8)

std::tie标题中可以使用<tuple>来实现满足严格弱排序的小于比较的最简单实现:

bool operator<(const structureKeyID& param) const
{
  return std::tie(keyA, keyB, keyC) < std::tie(param.keyA, param.keyB, param.keyC);
}

执行字典比较。如果您没有C ++ 11支持,可以在TR1和Boost中找到等价物。

答案 1 :(得分:6)

试试这个

// 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;
}

您的版本没有定义一致的排序(技术术语是严格的弱排序),因为使用您的比较函数,A&lt; B&lt; C&lt; A,所以std::map感到困惑。