繁体   English   中英

使用std :: map或std :: multimap排序数据

[英]Sorting data using std::map or std::multimap

新年快乐。 希望大家一切都好。 我已经来过一段时间了。

我有一些要整理的隐形眼镜数据。 我有一些排序规则是静态的(硬编码),然后是其他规则,形成“正常”规则

要求如下:

  1. 公司和产品的第一个排序是静态订单(硬编码,非字母顺序)

    样品

    o公司产品名称

    1. Ciba 1. Focus,2。AirOptics,3.Dailies,4。然后按字母顺序。
    2. 博士伦1. PureVision,2。LiquidEye,3. Softlens,然后按字母顺序。
  2. 其次是包装尺寸递减(80,30 ...)

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

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

最后的结果可能如下所示

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

数据与其他数据一起包含在结构中。 带有键的地图中使用了该灰泥。 我正在构建用于对静态需求进行排序的密钥,如下所示。

键在键的前面包含一个前缀以强制进行静态排序(非字母顺序),后跟一个后缀以使键唯一。 样本键:“ 1_1_Ciba_Focus Monthlys_4”

我对其他需求进行排序的计划是采用其他每个需求(PackageSize,Base Curve和Sphere),并使用键将它们与上一个元素进行排序。

由于我将对以下包装大小(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

您可以编写一个比较函子,该函子可以考虑许多条件。 想法是从最重要的标准开始,然后仅在上层级别相等时才从列表中移出。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM