2012-10-11 106 views
0

我有时间戳和一些数据的地图map<string,double> mymap;我怎样才能按时间戳排序,这样一切都按照chrnological的顺序? 继承人什么是里面的样本数据集, 我有什么。排序一个std :: map <string,double>

< 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 
+5

不要存放时间戳的字符串。将其转换为正确的数字表示。 – Joe

+0

你是如何得到这个输出的?我想不出有什么理由'map '会按照您声明的顺序存在数据。 –

+1

是不是'std :: map'总是自动排序? –

回答

3

std::map应始终进行排序:

内部,在map元素被以下建筑设置特定的严格弱排序标准从低到高的关键值排序。

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

+0

那么,它是按照ASCII-betically排序的(除非指定了比较运算符)。但是,正如Benj指出的那样,ASCII-betically对于这种情况是正确的。 –

+3

@MaxLybbert是的,ISO 8601专门设计用于在这种情况下正确排序。 –

8

你运气实际上是因为你的时间戳YMD H:M:S(ISO 8601),时间排序的顺序是一样的字符串排序订购。因此,因为std::string有一个operator<(),所以如果遍历它,则您的std::map已按日期顺序排列。你所要做的就是填写地图,它会自己订购。

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

1

您可以存储日期的64位代表,并用它来你的项目进行排序或写一个比较器,将字符串转换为日期比较 - 前

希望是对您有用。

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; 
    } 
} 
相关问题