【发布时间】:2014-02-01 11:51:37
【问题描述】:
更新:我遵循约翰的指导并修改了他的代码,通过创建比较器函数解决了我的问题,并将其插入到 STL 映射中的比较参数中。由于我的字符串日期严格采用所示格式,因此使用 substr 就可以了。我的输出和代码如下供您参考。
Date Total Sales
01JAN1900 $4
20JAN1902 $40
18NOV1912 $2500
19NOV1912 $2500
19OCT1923 $25
01JAN1991 $22
15NOV1991 $300
Grand Total: $5391
struct CompareDates
:
public std::binary_function <bool, std::string, std::string>
{
bool operator() (const std::string& lhs, const std::string& rhs)
{
if(lhs.substr(5,4) < rhs.substr(5,4))
{
return true;
}
else if (lhs.substr(5,4) == rhs.substr(5,4) && lhs.substr(2,3) < rhs.substr(2,3))
{
return true;
}
else if (lhs.substr(5,4) == rhs.substr(5,4) && lhs.substr(2,3) == rhs.substr(2,3) && lhs.substr(0,2) < rhs.substr(0,2))
{
return true;
}
else
{
return false;
}
}
};
map<string, double,CompareDates> dailyDatePrices;
最初的问题:我需要将原始数据分类为每日报告格式。因此,我使用 STL map 将日期存储为键,将商品价格存储为值。根据我的阅读,STL 映射是自动排序的。但是我不希望它按地图排序,因为它会生成下面所述的不想要的当前报告输出。我想根据字符串日期(从最早到最新)进行排序,并希望它是那种精确的格式。在使用 map 之前,我已经使用向量和函数比较器对日期进行排序。有什么办法可以去做吗?谢谢!
Raw Data
STRAW:10:15NOV1991
TOY:10:15NOV1991
BARLEY:5:01OCT1992
Undesired Current Report Output
01OCT1992 5
15NOV1991 20
Expected Report Output
15NOV1991 20
01OCT1992 5
【问题讨论】:
-
使用选择的排序标准实例化地图。
-
您将不得不将字符串转换为日期,并让日期上的排序得到正确的顺序(或在执行该排序的强者上使用比较器) - 最好寻找日期库
-
您的
Date类是如何定义的?特别是operator<在那个班级? -
@juanchopanza:这根本不是重复的。这个问题是关于改变排序顺序的。这个问题是关于改变排序的类型。