1

我有两个std::vector<string>'s都带有 ISO 8601 时间戳,其中向量 A 映射到数字,向量 B 映射到标题

A 映射为

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

B 映射为

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

然后我有第三张地图,从标题到名称

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

本质上,我要做的是获取向量 A 在向量 B 的时间戳处映射到的数据。我遇到的问题是向量 A 具有以下格式的 iso 时间戳,其中秒始终为零,

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 的最佳方法是什么?

我对最佳方法的两个猜测是将向量 B 的第二个向下舍入,或者在 ie 之前和之后采用某种加权平均值2012-02-25 06:09:002012-02-25 06:10:00.什么是最好的方法,我该如何实现它?

4

1 回答 1

3

首先,你应该让自己成为一个比较函子,它只比较字符串到分钟,即前十六位数字:

#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 回答