0

我有一张时间戳地图和一些数据 map<string,double> mymap; ,我如何按时间戳对其进行排序,以便一切都按时间顺序排列?继承人的样本数据集里面有什么,我有什么。

 < timestamp           ,         data>

"2011-02-04 14:14:51"             1
"2010-09-24 07:45:13"             2
"2011-10-28 11:10:32"             3
"2008-10-27 11:10:32"             4
"2008-10-27 11:10:33"             5

期望的结果

"2008-10-27 11:10:32"             4
"2008-10-27 11:10:33"             5
"2010-09-24 07:45:13"             2
"2011-02-04 14:14:51"             1
"2011-10-28 11:10:32"             3
4

4 回答 4

8

您实际上很幸运,因为您的时间戳是 YMD H:M:S (ISO 8601),时间排序顺序将与字符串排序顺序相同。因此,因为std::string有一个,如果您遍历它operator<(),您将已经按日期顺序排列。std::map您所要做的就是填写地图,它会自行排序。

当然,以数字或日期对象格式存储日期确实是个好主意,boost::posix_time::ptime例如。这在内存和处理方面肯定会更高效,因为昂贵的字符串比较将被廉价的整数比较所取代。

于 2012-10-11T19:55:51.270 回答
3

std::map应始终排序:

在内部,map按照在构造上设置的特定严格的弱排序标准,从低到高的键值对元素进行排序。

我唯一能想到的是它没有正确比较字符串。使用整数或旨在存储日期的格式可能会有所帮助。

于 2012-10-11T19:56:18.403 回答
2

只需按自然顺序打印出来,如下所示:

#include <map>
#include <iostream>

int main () {
  std::map<std::string, double> map;

  map["2011-02-04 14:14:51"] = 1;
  map["2010-09-24 07:45:13"] = 2;
  map["2011-10-28 11:10:32"] = 3;
  map["2008-10-27 11:10:32"] = 4;
  map["2008-10-27 11:10:33"] = 5;

  std::map<std::string, double>::iterator it(map.begin()), end(map.end());
  while(it != end) {
    std::cout << '"' << it->first << '"' << "     " << it->second << "\n";
    ++it;
  }
}
于 2012-10-11T20:18:59.187 回答
1

您可以存储日期的 64 位表示形式并使用它对项目进行排序或编写一个比较器,在比较之前将字符串转换为日期

希望对你有用。

于 2012-10-11T19:56:03.097 回答