我正在使用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) 我想要做的是有效地处理间隔.例如,在我的示例中,间隔如下所示:
[10, 20], [15, 25], [40, 100], [5, 14]
间隔是封闭的和整数,有些间隔可能会过度.我想找到重叠的区间给定的查询效率.例如,如果[16, 22]
给出:
[10, 20], [15, 25]
应将上述间隔计算为整数间隔.
我目前正在编写一个基于红黑树的区间树(参考:CLRS,算法简介).虽然找到所有重叠间隔可以是O(n),但运行时间应该更快.请注意,可以删除和插入间隔.
但是,我刚刚发现Boost已经interval_map
和interval_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
适合我的目的?
我开始使用 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)
注意:以上称为“静态”间隔(因为它们的绑定属性是类型的一部分)。动态间隔按预期工作。
我正在迭代一个boost interval_set<unsigned_int>
,我期望每个迭代器都是一个boost interval
,其值将使用upper
和lower
方法访问:
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)
但我在两个方法lower
和upper
方法都收到错误:方法...无法解决,这表明迭代器根本没有指向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) 我有一个服务,在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) Boost.ICL的interval_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)