我有一些我正在尝试排序的隐形眼镜数据。我有一些排序规则是静态的(硬编码),其他规则是“正常”规则
以下是要求:
首先按公司和产品排序是静态订单(硬编码,非字母)
示例
随后包装尺寸降低(80,30 ......)
其次是基本曲线下降(8.6,8,0 ......)
其次是Sphere decending(-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
数据包含在包含其他数据的结构中。 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
答案 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;
}
};