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 に答える