2012-10-11 63 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; 
    } 
} 
相關問題