我有一个字典,其键类型为 Setting,其中设置是一个具有成员 mCategory(字符串)、mIndex(int)和 mDescription(字符串)的结构。有些键是唯一的 - 最多有一个具有相同的 mCategory。它们的 mIndex 设置为 -INF 并且它们的描述是任意的。
其他键将遵循一个序列,例如,mCategoryBooks中的项目可以具有mIndex1、2、3等。后者的描述不是任意的。它们的前缀为 mCategory + mIndex。我希望键按描述排序,直到我们处于非唯一的mCategory。我想按 mIndex 对具有相同 mCategory 的键进行排序,因为按字典顺序对整个内容进行排序会将第 10 本书放在第 1 本书之后。这就是我想要的 - 但我不知道如何让它按照我想要的方式排序
描述 | 索引 | 类型 |
---|---|---|
ABC | -INF | X |
BCD | -INF | 是 |
CDE | -INF | Z |
D 1 | 1 | D |
D 2 | 2 | D |
D 3 | 3 | D |
D 4 | 4 | D |
.. | .. | .. |
D 10 | 10 | D |
.. | .. | D |
这是我写的比较器,但这显然不起作用:
bool operator()(const myStruct& rLeft, const myStruct& rRight) const
{
if (rLeft.mCategory == rRight.mCategory)
return rLeft.mIndex < rRight.mIndex;
else return rLeft.mDescription.CompareNoCase(rRight.m_sDescription) < 0;
}
澄清: 我不想按唯一性排序,我想按描述排序,直到按描述排序找到非唯一类别,然后按索引对该子序列进行排序,然后继续按描述排序,直到出现另一个非唯一子序列,依此类推.
确保对多个标准进行有效比较的最简单方法是始终使用
std::tuple::operator<
,合成代表订单优先级的值。
bool operator()(const myStruct& rLeft, const myStruct& rRight) const
{
return std::tuple{ rLeft.mIndex != -INF, rLeft.mCategory, rLeft.mIndex }
< std::tuple{ rRight.mIndex != -INF, rRight.mCategory, rRight.mIndex };
}
这将按唯一性排序,然后是类别,然后是索引。