【问题标题】:Returning an iterator to a time in a multi-map that is closest to a specified time将迭代器返回到多映射中最接近指定时间的时间
【发布时间】:2012-01-05 12:33:29
【问题描述】:

有人可以提出一个优雅的方法来解决以下问题吗?

我有一个以时间为键的多地图,我希望返回最接近指定时间 T 发生的项目。此外,在地图中搜索的时间只能是 T 两侧的一个小时。

尝试了多种技术,但最有效的方法似乎是首先拒绝所有不在 T 小时内的时间,然后遍历剩余项目以找到最接近 T 的时间。

【问题讨论】:

    标签: c++ stl map multimap


    【解决方案1】:

    只需使用map.lower_bound() 查找不低于您要查找的第一个时间,然后只需检查相邻的(较小的)是否比lower_bound() 返回的更近,您就完成了。

    【讨论】:

    • 其实,我认为“检查相邻”步骤必须迭代完成,而与实际时间的差异T停止减少。
    • @larsmans:你能详细说明一下吗?由于订购了多图,T 介于lower_bound - 1lower_bound 之间,我看不出它如何离另一个键更近。或者您的意思是,由于我们正在处理多地图,因此可能有几个项目最接近 T
    • @LucTouraille:我的想法。没关系,+1 让我成为。
    • @LucTouraille 即使在多地图中,您也只需要检查一个,因为lower_bound 返回的第一个不是更小,所以您只需要检查更小的那个。
    • 可以,只需要检查lower_boundlower_bound - 1就可以找到最接近的key,但是这个key可以关联多个值;这就是我对@larsmans 的问题的意思。
    【解决方案2】:

    首先尝试查找具有确切时间的条目怎么样。如果未找到,则检查 time + 1,然后 time - 1,然后 time + 2,等等,直到从 time 达到一小时的限制。

    【讨论】:

    • 根据时间戳的粒度,这可能会导致 lot 的查找。
    • @larsmans 先检查是否完全匹配,如果没有找到,请执行 Let_Me_Be 建议的操作?
    • 首先检查完全匹配是对@Let_Me_Be 方法的(过早的)优化。
    • @larsmans:我什至会说这是一种悲观,因为寻找精确匹配并不比获得下限更快。通常会有两个查找而不是一个,根本没有任何收获。
    • @LucTouraille 不仅如此,lower_bound() 实际上返回完全匹配,如果有的话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多