c – 在已排序的STL容器中查找给定键的“最佳匹配键”
问题
我有时间戳数据,我需要根据时间戳进行搜索,以获得与我最接近的输入时间戳匹配的现有时间戳. struct STimestampedData { time_t m_timestamp; // Sorting criterion CData m_data; // Payload } 使用stl :: vector,sort()和equal_range()的方法 由于地图或集合只允许我找到完全匹配,我不会再使用其中一个. 虽然这不是太复杂,但我想知道是否有更优雅的解决方案. 更新:线性与二进制搜索 我忘了提到我有很多数据需要处理,所以我不想要线性搜索. 解决方法
我会使用set :: lower_bound来查找匹配或更大的值,然后递减迭代器以检查下一个较低的值.您应该使用std :: set而不是std :: map,因为您的密钥嵌入在对象中 – 您需要提供一个比较时间戳成员的仿函数.
struct TimestampCompare { bool operator()(const STimestampedData & left,const STimestampedData & right) const { return left.m_timestamp < right.m_timestamp; } }; typedef std::set<STimestampedData,TimestampCompare> TimestampedDataSet; TimestampedDataSet::iterator FindClosest(TimestampedDataSet & data,STimestampedData & searchkey) { TimestampedDataSet::iterator upper = data.lower_bound(searchkey); if (upper == data.begin() || upper->m_timestamp == searchkey.m_timestamp) return upper; TimestampedDataSet::iterator lower = upper; --lower; if (upper == data.end() || (searchkey.m_timestamp - lower->m_timestamp) < (upper->m_timestamp - searchkey.m_timestamp)) return lower; return upper; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |