1

std::vector<string>'sベクトル A が数字にマップされ、ベクトル B が見出しにマップされる ISO 8601 タイムスタンプを持つ 2 つの両方があります。

A は次のようにマッピングされます

 typedef pair<string,string> Key;   //<name,timestamp>
 typedef map< Key, double> Map;     //number
 Map pair_map;

B は次のようにマッピングされます

 map<string,string> Map2; //<headline,timestamp>

次に、見出しから名前までの 3 番目のマップがあります。

 map<string,string> Map3; //<headline,name>

基本的に私がやろうとしているのは、ベクター A がベクター B のタイムスタンプにマップするデータを取得することです。

2012-02-25 06:09:00
2012-02-25 06:10:00

ベクトル B は数秒でそれを取得します

2012-02-25 06:09:32
2012-02-25 06:09:38
2012-02-25 06:09:51

ベクトル A をベクトル B にマッピングする最良の方法は何でしょうか?

最良のアプローチでの私の 2 つの推測は、ベクトル B の秒を切り下げること、または前後にある種の加重平均を取ること、および最良のアプローチは何で2012-02-25 06:09:00あり2012-02-25 06:10:00.、どのように実装できますか?

4

1 に答える 1

3

まず、文字列を分単位まで、つまり最初の 16 桁までのみ比較する比較ファンクタを作成する必要があります。

#include <string>

struct isotimecomp
{
    // models "s1 < s2" for ISO time stamps
    bool operator()(std::string const & s1, std::string const & s2) const
    {
        return s1.compare(0, 16, s2, 0, 16) < 0;
    }
};

これで、どのような方法でも使用できます。たとえば、タイムスタンプをキーとする連想コンテナを作成できます。

#include <map>

std::map<std::string, std::pair<int, std::string>, isotimecomp> timestamp_data;

または、並べ替えられたベクトルを作成できます。

#include <vector>
#include <algorithm>

std::vector<std::string> v;

std::sort(v.begin(), v.end(), isotimecomp());

次に、ベクトルでバイナリ検索を実行できます。

std::string str = "2012-02-25 06:09:00";
auto it = std::lower_bound(v.begin(), v.end(), str, isotimecomp());

またはfind_if、ベクターで使用できますが、別の述語が必要です。

auto it = std::find_if(v.begin(), v.end(), [&str](std::string const & s) -> bool
                       { return str.compare(0, 16, s, 0, 16) == 0;} );
于 2012-10-27T18:30:12.750 に答える