排序std :: map <string,double> </string,double>

时间:2012-10-11 19:50:45

标签: c++ c++11

我有一张时间戳和一些数据map<string,double> mymap;的地图我怎样才能按时间戳对它进行排序,以便所有内容都按照chrnological的顺序排列? 下面是一个里面的样本数据集,   我有什么。

 < 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 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

std::map应始终排序:

  

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

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

答案 2 :(得分: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;
  }
}

答案 3 :(得分:1)

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

希望对你有用。