对具有多个键的字典中的键进行排序,同时将某些键保留在一起

问题描述 投票:0回答:1

我有一个字典,其键类型为 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;  
}

澄清: 我不想按唯一性排序,我想按描述排序,直到按描述排序找到非唯一类别,然后按索引对该子序列进行排序,然后继续按描述排序,直到出现另一个非唯一子序列,依此类推.

c++ dictionary sorting comparator
1个回答
1
投票

确保对多个标准进行有效比较的最简单方法是始终使用

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

这将按唯一性排序,然后是类别,然后是索引。

© www.soinside.com 2019 - 2024. All rights reserved.