[英]Sorting data using std::map or std::multimap
新年快乐。 希望大家一切都好。 我已经来过一段时间了。
我有一些要整理的隐形眼镜数据。 我有一些排序规则是静态的(硬编码),然后是其他规则,形成“正常”规则
要求如下:
公司和产品的第一个排序是静态订单(硬编码,非字母顺序)
样品
其次是包装尺寸递减(80,30 ...)
其次是基础曲线下降(8.6,8,0 ...)
其次是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.