使用std :: map或std :: multimap对数据进行排序

时间:2011-01-16 01:12:48

标签: c++

新年快乐。希望大家都好。我有一段时间没来过这里。

我有一些我正在尝试排序的隐形眼镜数据。我有一些排序规则是静态的(硬编码),其他规则是“正常”规则

以下是要求:

  1. 首先按公司和产品排序是静态订单(硬编码,非字母)

    示例

    o公司产品名称

    1. Ciba 1. Focus,2。AirOptics,3。Dailies,4。然后按字母顺序排列。
    2. Bausch& Lomb 1. PureVision,2。LiquidEye,3。Softlens然后按字母顺序排列。
  2. 随后包装尺寸降低(80,30 ......)

  3. 其次是基本曲线下降(8.6,8,0 ......)

  4. 其次是Sphere decending(-0.5,0.0,1.0 ......)

  5. 最后,结果可能如下所示

    Sample data
    CO    PR     PS    BC    Sp
    -------------------------------
    Ciba  Focus  10    8.6    0.00
    Ciba  Focus  20    8.6   -0.25
    Ciba  Focus  20    8.6   -0.10
    Ciba  Focus  20    8.6   +0.25
    Ciba  Air    10    8.6   -0.25
    Ciba  Air    10    8.6   -0.10
    Ciba  Air    20    8.1   -0.25
    Ciba  Air    20    8.1   -0.10
    Ciba  Air    20    8.1    0.00
    Ciba  Air    20    8.6   +0.25
    Ciba  Air    20    8.6   +0.40
    

    数据包含在包含其他数据的结构中。 stuct用于带有键的地图中。我正在构建一个密钥来排序静态需求,如下面。

    密钥在密钥的前面包含一个前缀以强制静态排序(非字母),后跟一个后缀以使密钥唯一。示例键:“1_1_Ciba_Focus Monthlys_4”

    我对其他要求进行排序的计划是采用其他每个要求(PackageSize,Base Curve和Sphere),并使用密钥对前一个元素进行排序。

    因为我将对以下agaist进行排序包大小(10,20 ...) - 也许我应该使用multimap,因为它可能是复活节来排序这些东西而没有在键的末尾有唯一的ID ??

    使用“1_1_Ciba Focus”键,我会对PackSize进行排序,然后设置密钥以产生正确的排序

    start: (std::multimap)
    key: 1_1_Ciba  Focus"
    Sample data
    CO    PR     Key
    -------------------------------
    Ciba  Focus  1_1_Ciba  Focus
    Ciba  Focus  1_1_Ciba  Focus
    Ciba  Focus  1_1_Ciba  Focus
    Ciba  Focus  1_1_Ciba  Focus
    
    Sample data
    CO    PR     PS    Key
    -------------------------------
    Ciba  Focus  10    1_1_1_Ciba  Focus
    Ciba  Focus  20    1_1_2_Ciba  Focus
    Ciba  Focus  20    1_1_2_Ciba  Focus
    Ciba  Focus  20    1_1_2_Ciba  Focus
    

    谢谢, 克里斯 chris@macgowan.com

1 个答案:

答案 0 :(得分:1)

您可以编写一个可以考虑任意数量标准的比较函子。我们的想法是从最重要的标准开始,然后只有当上层水平相等时才进入列表。

struct LensCompare
{
    bool operator()(const Data & left, const Data & right)
    {
        if (left.key < right.key)
            return true;
        else if (right.key < left.key)
            return false;
        if (left.PR < right.PR)
            return false;  // for descending order return "false" when less than
        else if (right.PR < left.PR)
            return true;
        if (left.BC < right.BC)
            return false;
        else if (right.BC < left.BC)
            return true;
        return right.Sp < left.Sp;
    }
};