【发布时间】:2015-02-09 11:15:21
【问题描述】:
我需要满足以下用例的数据结构:
- 按键存储项目
- 按键检索准确值的功能
- 按键检索最接近的先验值的功能
- 通过键检索最接近的后续值的功能
1 和 2 是显而易见的。对于 3(和 4),假设键是自定义 Date 对象,最接近的先验值,例如搜索 2014 年 12 月 1 日,将返回日期最接近 2014 年 12 月 1 日的值。因此,如果先验values 的键为 11 月 10 日、11 日、14 日、15 日和 29 日,那么它将返回 11 月 29 日。对于 4,功能相同,但最接近的日期应在 12 月 1 日之后。
目前我使用的是std::map<Date, T>,但对 3 和 4 的要求是新的。我考虑过的事情:
- 继续使用
std::map<Date, T>(log-n 存储和精确检索。最接近的匹配将是蛮力,因此在速度方面大约为 n) - 使用
std::vector<T>,使用我自己的排序例程(常量存储,log-n 检索精确和最接近的;我可以滚动我自己的获取例程并通过索引访问std::vector<T>的成员以进行快速二分搜索)
我倾向于std::vector<T>,因为我的 T 对象具有内置日期(对于std::map<Date, T> 而言,日期只是T.date() 属性的副本)。
这些数据存储的行为是预先大量加载,并且在对象的整个生命周期中偶尔会发生,但会不断地获取内容。因此,任何前端繁重但查找量少的数据结构都可以工作。
想法?
【问题讨论】:
-
std::lower_bound+std::upper_bound或std::map::lower_bound+std::map::upper_bound -
谢谢;这正是我所需要的。我之前没有听说过
std::lower_bound或std::upper_bound项目。巧合的是,cppreference.com 上的描述与我实现自己的 roll-your-own 版本的方式相同! -
我懒得把它写成你的问题的答案,我的建议是你自己写(stackoverflow实际上鼓励自我回答的问题(帮助未来的访问者通过以下方式找到你的问题)搜索引擎))
-
抱歉 - 不确定我在哪里找人写的?
-
你没有要求它,虽然这是一个 Q&A 网站..
标签: c++ c++11 dictionary vector