1

我正在使用boost::icl::interval_mapsint intervals,我想知道如何获取属于某个间隔的 int (key) 的值?

例如,如果我们有一个具有以下结构的区间图

[0, 5): ["A1", "A2"],
[5, 10): ["A2"]

我使用4我想获得的密钥["A1", "A2"]。我在 boost 文档中看到的所有示例都遍历了整个结构。

4

1 回答 1

1

这个实现应该可以工作,但可能有一个更优雅的实现,甚至是 icl 中的一个函数,它正是这样做的。我建议研究文档。

icl 中的大多数函数都通过键类型(即区间)提供访问。您想查询一个点,它可以用一个闭区间 [N,N] 表示。lower_bound 似乎是显而易见的选择,然后检查此间隔是否“高于/大于”您的查询点。

#include <iostream>
#include <boost/optional.hpp>
#include <boost/icl/interval_map.hpp>
#include <boost/icl/interval.hpp>

using namespace boost::icl;

template<typename Key, typename Value>
boost::optional<Value> query(const interval_map<Key,Value>& map, Key key)
{
    auto kvp = map.lower_bound(interval<int>::closed(key, key));
    if(kvp != map.end() && contains(kvp->first, key))
        return kvp->second;
    else
        return boost::none;                              
}

int main()
{   

    interval_map<int,std::string> map;

    map += std::make_pair(interval<int>::right_open(1,5), std::string("A"));
    map += std::make_pair(interval<int>::right_open(2,3), std::string("B"));
    map += std::make_pair(interval<int>::right_open(1,3), std::string("C"));
    map += std::make_pair(interval<int>::right_open(5,6), std::string("D"));

    auto value = query(map, 2);

    if(value)
        std::cout << *value;

    return 0;    
}
于 2019-11-26T12:59:56.947 回答