我应该使用哪个boost库来添加描述中提到的间隔?

时间:2017-10-10 20:53:16

标签: c++11 boost-icl

我正在c ++程序中进行间隔工作。我想要下面的东西:

我想在for循环中迭代添加间隔。假设我的第一个间隔是(0,5)。我想添加一个区间(3,6),使得得到的区间集应该是(0,3),(3,6)。如果我添加的第三个区间是(4,7),我得到的区间设置应该是(0,3),(3,4),(4,7)。

任何想法我应该从boost库使用什么类型的间隔容器?任何示例程序?

这就是我试过的......

int main()
{
    icl::interval_map<double, std::string> add_map;
    using ival = icl::interval<double>;

    add_map.add({ival::open(1., 2.5), "A1"});
    std::cout<<"adding first interval-----"<<"\n";
    for(auto iter : add_map)
            std::cout << iter.first << ": " << iter.second << ", "; std::cout << "\n";

    add_map.add({ival::open(1.5, 5.), "B1"});
    std::cout<<"adding second interval-----"<<"\n";
    for(auto iter : add_map)
        std::cout << iter.first << ": " << iter.second << ", "; std::cout << "\n";
    //after adding second interval, i have to get something like (1,1.5]: A1, (1.5,5): B1 
    return 0;
}

但我得到以下输出: 添加第一个间隔----- (1,2.5):A1,

添加第二个间隔----- (1,1.5):A1,(1.5,2.5):A1B1,[2.5,5):B1,

1 个答案:

答案 0 :(得分:1)

这就是interval_map的工作原理:它在重叠时分裂并创建新的间隔。这会对给定间隔或元素有效的所有项目进行查询,请参阅this doc page

困扰我的是,在文中你提到了整数,但在你使用double的代码中。

请注意,double间隔可能会出现问题。例如,[2, 2.5)可能与(2.5, 3)相交,具体取决于舍入。请参阅此帖子Basic use of function "contains" in Boost ICL: Are some combinations of interval types and functions not implemented?

如果您只想存储间隔,我认为您需要的数据结构是interval set