标签: boost-icl

boost interval_map是否有operator []或.at()方法?

我正在使用BOOST库中的interval_map.

typedef set<int> Tpopulations;    
interval_map<int, Tpopulations> populations;
Run Code Online (Sandbox Code Playgroud)

说我在人群中有这个

[1006311,1006353)   1611,1653,
[1006353,1006432)   1031,1611,1653,
[1006432,1006469]   1031,1387,1523,1611,1653,
(1006469,1006484]   1031,1387,1611,1653,
(1006484,1006496]   1031,1387,1611,
(1006496,1006506]   1031,1611,
(1006506,1006547]   1031,
Run Code Online (Sandbox Code Playgroud)

现在我想找出映射在某个数字上的内容:我希望如下:

cout << populations[1006313];  // 1611,1653
Run Code Online (Sandbox Code Playgroud)

要么

cout << populations.at(1006313);  // 1611,1653
Run Code Online (Sandbox Code Playgroud)

但是我似乎没有找到任何这样的方法.

我是否真的需要将其他间隔图定义为"窗口"并进行交叉?就像是:

interval_map<int, Tpopulations> window;
set<int>empty_set;
window +=(make_pair(1006313,empty_set));
cout << populations & window
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-icl

9
推荐指数
1
解决办法
1071
查看次数

我可以使用Boost interval_map来做到这一点吗?

我想要做的是有效地处理间隔.例如,在我的示例中,间隔如下所示:

[10, 20], [15, 25], [40, 100], [5, 14]

间隔是封闭的和整数,有些间隔可能会过度.我想找到重叠的区间给定的查询效率.例如,如果[16, 22]给出:

[10, 20], [15, 25]

应将上述间隔计算为整数间隔.

我目前正在编写一个基于红黑树的区间树(参考:CLRS,算法简介).虽然找到所有重叠间隔可以是O(n),但运行时间应该更快.请注意,可以删除和插入间隔.


但是,我刚刚发现Boost已经interval_mapinterval_set:http: //www.boost.org/doc/libs/1_46_1/libs/icl/doc/html/index.html

我试过了,但这种行为对我来说很奇怪.例如,如果[2, 7]首先被插入,然后[3, 8]被插入,然后将得到的地图将有[2, 3),[3, 7],和(7, 8].也就是说,当插入新间隔时,自动完成分割.

我可以关闭此功能吗?或者,Boost interval_map适合我的目的?

c++ algorithm boost data-structures boost-icl

6
推荐指数
1
解决办法
7406
查看次数

Boost ICL 中函数“contains”的基本用法:区间类型和函数的某些组合是否未实现?

我开始使用 Boost ICL,并偶然发现了非常基本的东西。例如,函数contains应返回 true 或 false,具体取决于给定元素是否在区间内。然而,这适用[right,left]_open_intervals但不适用[open,closed]_inteval(参见下面的示例)。

这似乎太明显了,不可能是一个疏忽。我正在以预期的方式使用图书馆吗?

例如(使用 gcc 4.8 或 clang 3.3 和 Boost 1.54):

#include <boost/concept_check.hpp> //needed to make this MWE work, boost icl should include it internally

#include<boost/icl/right_open_interval.hpp>
#include<boost/icl/closed_interval.hpp>
#include<boost/icl/open_interval.hpp>
int main(){
    boost::icl::right_open_interval<double> roi(6.,7.);
    assert(boost::icl::contains(roi, 6.) == true);  //ok
    assert(boost::icl::contains(roi, 6.) == false); //ok

    boost::icl::closed_interval<double> oi(4.,5.); // or open_interval
    assert(boost::icl::contains( oi, 4.) == false); //error: "candidate template ignored"
    assert(boost::icl::contains( oi, 5.) == false); //error: "candidate template ignored"
}
Run Code Online (Sandbox Code Playgroud)

注意:以上称为“静态”间隔(因为它们的绑定属性是类型的一部分)。动态间隔按预期工作。

c++ boost boost-icl

5
推荐指数
1
解决办法
1679
查看次数

迭代boost :: icl :: interval_set

我正在迭代一个boost interval_set<unsigned_int>,我期望每个迭代器都是一个boost interval,其值将使用upperlower方法访问:

boost::icl::interval_set<unsigned int> outages;
// ...
// Insert intervals into the database
for(boost::icl::interval_set<unsigned int>::iterator it =
    outages.begin(); it != outages.end(); it++){

    DATA_ACQUISITION::InsertInterval(db, it->lower(),
        it->upper())
}
Run Code Online (Sandbox Code Playgroud)

但我在两个方法lowerupper方法都收到错误:方法...无法解决,这表明迭代器根本没有指向interval.

那么,我在这里迭代的是什么?如何迭代虽然intervals插入到interval_set?

编辑:添加SSCCE:

#include <boost/icl/interval_set.hpp>
#include <iostream>
#include <vector>


int main() {
    boost::icl::interval_set<unsigned int> outages;
    for(unsigned int i=0; i<5; i++){
        outages += boost::icl::discrete_interval<unsigned int>::closed(
            (i*10), ((i*10) + 5));
    }

    for(boost::icl::interval_set<unsigned int>::iterator it = …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-icl

5
推荐指数
2
解决办法
2032
查看次数

N Boost interval_set的组合

我有一个服务,在4个不同的地方停运.我将每个位置中断建模为Boost ICL interval_set.我想知道什么时候至少有N个地点有活动中断.

因此,在这个答案之后,我实现了一个组合算法,因此我可以通过interval_set交集创建elemenets之间的组合.

当这个过程结束时,我应该有一定数量的interval_set,每个interval_set同时定义N个位置的中断,最后一步将加入它们以获得所需的全图.

问题是我正在调试代码,当打印每个交集的时间到了,输出文本变得疯狂(即使我正在逐步使用gdb进行调试),我看不到它们,导致大量CPU使用.

我想我不知何故发送输出的内存比我应该多,但我看不出问题出在哪里.

这是一个SSCCE:

#include <boost/icl/interval_set.hpp>
#include <algorithm>
#include <iostream>
#include <vector>


int main() {
    // Initializing data for test
    std::vector<boost::icl::interval_set<unsigned int> > outagesPerLocation;
    for(unsigned int j=0; j<4; j++){
        boost::icl::interval_set<unsigned int> outages;
        for(unsigned int i=0; i<5; i++){
            outages += boost::icl::discrete_interval<unsigned int>::closed(
                (i*10), ((i*10) + 5 - j));
        }
        std::cout << "[Location " << (j+1) << "] " << outages << std::endl;
        outagesPerLocation.push_back(outages);
    }

    // So now we have a vector of interval_sets, one per …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm boost intervals boost-icl

4
推荐指数
1
解决办法
597
查看次数

Boost ICL映射是否可以按间隔替换值?

Boost.ICLinterval_map有两种行为:+=insert。两者在不同的上下文中都是有用的。第一个将两个现有间隔的公共交点处的值相加。第二种方法仅在先前未分配的间隔中引入新值(在先前分配的间隔中保留值)。

但是,我需要一种与众不同的行为,这样,在下面的示例中,(1.,2.)->1 , (2.5,3.)->3, (3.,5.)->2我得到了期望的,而不是得到了不需要的间隔图(1.,2.)->1 , (2.5,5.)->3

也就是说,新插入的值替换了旧值吗?我如何声明interval_map要获得替换行为?

#include<boost/icl/interval_map.hpp>
int main(){
    boost::icl::interval_map<double, int> joined_map;
    joined_map.insert( std::make_pair(
        boost::icl::interval<double>::open(1., 2.),
        1
    ));
    joined_map.insert( std::make_pair(
        boost::icl::interval<double>::open(3., 5.),
        2
    ));
    joined_map.insert( std::make_pair(
        boost::icl::interval<double>::open(2.5, 5.),
        3
    )); // this line doesn't replace the old value 2, it keeps it.
}
Run Code Online (Sandbox Code Playgroud)

奖金:boost::icl::map应该做什么?如何使用?


编辑1:这是使用C ++ 11的更明确和简化的示例代码

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

namespace icl = boost::icl;
using interval = icl::interval<double>; …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-icl

3
推荐指数
1
解决办法
1174
查看次数

标签 统计

boost ×6

boost-icl ×6

c++ ×6

algorithm ×2

data-structures ×1

intervals ×1