Задача
У меня есть данные с метками времени, которые мне нужно искать на основе метки времени, чтобы получить одну из существующих меток времени, которая соответствует моей входной метке времени, самой близкой.
Предпочтительно это должно быть решено с STL. boost :: * или stl :: tr1 :: * (из VS9 с Featurepack) также возможны.
Пример данных с меткой времени:
struct STimestampedData
{
time_t m_timestamp; // Sorting criterion
CData m_data; // Payload
}
Подход с stl::vector
, sort()
и equal_range()
Так как map
или set
позволяет мне только находить точные совпадения, я не могу больше использовать один из них.
Итак, теперь у меня есть vector
, к которому я добавляю данные по мере их поступления. Перед поиском я использую <algorithm>
s sort()
и снабжаю его пользовательской функцией сравнения.
После этого я использую <algorithm>
equal_range()
, чтобы найти двух соседей указанного значения x
.
Из этих двух значений я проверяю, какое из них ближе всего к x
, а затем у меня самое лучшее совпадение.
Хотя это не слишком сложно, мне интересно, есть ли более элегантные решения для этого.
Может быть, у STL уже есть алгоритм, который делает именно это, так что я не изобретаю что-то здесь?
Обновление: линейный или двоичный поиск
Я забыл упомянуть, что у меня достаточно много данных для обработки, поэтому я не хочу выполнять линейный поиск.
Причина, по которой я сортирую вектор с sort()
, заключается в том, что у него есть итераторы с произвольным доступом, чего нет у map
. Использование map
не позволит equal_range()
выполнить поиск с двойной логарифмической сложностью.
Я прав?