2012-10-27 6 views
1

У меня есть два std::vector<string>'s как с ISO 8601 меткой времени, где вектор А карты в ряд и карта вектора B в заголовокISO 8601 метки времени C++

А отображенная с

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, который имеет отметки времени в следующем формате, где секунды всегда ноль,

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 

что бы лучший способ отображения вектора а на вектор в?

Мои два предположения на лучший подход будет округлить вниз во второй по вектору В, или принять какое-то средневзвешенного до и после того, как то есть 2012-02-25 06:09:00 и 2012-02-25 06:10:00. Что бы наилучший подход, и как я могу осуществить это?

+0

Просто сравните исходную часть, вплоть до минут включительно. –

+0

@ KerrekSB, который бы вроде понравился округлить секунды до 00, как я могу это сделать? – pyCthon

+0

Каков тип вашего вектора? –

ответ

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;}); 
+0

@pyCthon: О, извините, 'find' не совсем работает так, как я его портировал. Ему нужен свой собственный специальный предикат, и он должен быть 'find_if'. –

+0

http://pastebin.com/445H6nwz вот ошибка, и я попробую find_if прямо сейчас спасибо! – pyCthon

Смежные вопросы