【问题标题】:Comparison Operator for Structure key in C++ Map TableC++ 映射表中结构键的比较运算符
【发布时间】:2013-04-28 01:16:26
【问题描述】:

我有由 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())

然后会报错:

调试断言失败!
\include\xtree 行:1268
表达式:无效的运算符

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

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

非常感谢!

【问题讨论】:

标签: c++ dictionary key operator-keyword


【解决方案1】:

满足严格弱排序的小于比较的最简单实现是使用std::tie,可在&lt;tuple&gt; 标头中找到:

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

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

【讨论】:

  • 我在这个项目中没有可用的元组。不过,我很欣赏这些信息,并将在未来研究联系。谢谢!
  • 如果keyA、keyB等都是浮点数,这对在map中使用这种结构作为key的稳定性有何影响?虽然使用单个浮点数作为映射键容易出错,但这种使用std::tie 的浮点数组合是否更好?
【解决方案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;
}

您的版本没有定义一致的排序(技术术语是严格的弱排序),因为使用您的比较函数可能有 A std::map 会混淆。

【讨论】:

  • 有道理! 3行代码,效果很好,谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-11-08
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
相关资源
最近更新 更多