- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
interval_map (in icl) 库是否支持删除?我可以根据迭代器查找范围并删除范围吗?
============ 来自 boost 示例的 party.cpp ===============
partyp->add( // add and element
make_pair(
interval<ptime>::right_open(
time_from_string("2008-05-20 19:30"),
time_from_string("2008-05-20 23:00")),
mary_harry));
party += // element addition can also be done via operator +=
make_pair(
interval<ptime>::right_open(
time_from_string("2008-05-20 20:10"),
time_from_string("2008-05-21 00:00")),
diana_susan);
party +=
make_pair(
interval<ptime>::right_open(
time_from_string("2008-05-20 22:15"),
time_from_string("2008-05-21 00:30")),
peter);
==========我的问题是我可以添加像
这样的删除语句吗 party -=
interval<ptime>::right_open(
time_from_string("2008-05-20 20:10"),
time_from_string("2008-05-21 00:00"));
我只想删除范围。任何方法都可以。
最佳答案
我知道这是一篇旧帖子,但我也有同样的问题,我终于找到了答案。
查看 docs我猜测 interval_map 的减法性和重叠聚合能力保证了减法作为删除操作。
It turned out to be a very fruitful concept to propagate the addition or subtraction to the interval_map's associated values in cases where the insertion of an interval value pair into an interval_map resulted in a collision of the inserted interval value pair with interval value pairs, that are already in the interval_map. This operation propagation is called aggregate on overlap.
假设我必须将 unix 时间戳的间隔与某些记录 ID(整数)相匹配。从此 answer 开始工作我想出了这个 MWE:
// interval_map_mwe.cpp
#include <map>
#include <set>
#include <climits>
#include <boost/icl/interval.hpp>
#include <boost/icl/interval_map.hpp>
// Set of IDs that cover a time interval
typedef std::set<unsigned int> IDSet_t;
// interval tree from intervals of timestamps to a set of ids
typedef boost::icl::interval_map<time_t, IDSet_t> IMap_t;
// a time interval
typedef boost::icl::interval<time_t> Interval_t;
#include <iostream>
// from https://stackoverflow.com/a/22027957
inline std::ostream& operator<< (std::ostream& S, const IDSet_t& X)
{
S << '(';
for (IDSet_t::const_iterator it = X.begin(); it != X.end(); ++it) {
if (it != X.begin()) {
S << ',';
}
S << *it;
}
S << ')';
return S;
}
int main(int argc, const char *argv[])
{
(void)argc; // suppress warning
(void)argv; // suppress warning
IMap_t m;
IDSet_t s;
s.insert(1);
s.insert(2);
m += std::make_pair(Interval_t::right_open(100, 200), s);
s = IDSet_t();
s.insert(3);
s.insert(4);
m += std::make_pair(Interval_t::right_open(200, 300), s);
s = IDSet_t();
s.insert(5);
s.insert(6);
m += std::make_pair(Interval_t::right_open(150, 250), s);
std::cout << "Initial map: " << std::endl;
std::cout << m << std::endl;
// find operation
IMap_t::const_iterator it = m.find(175);
std::cout << "Interval that covers 175: ";
std::cout << it->first << std::endl;
std::cout << "Ids in interval: " << it->second << std::endl;
// partially remove 5 from interval (160,180)
s = IDSet_t();
s.insert(5);
m -= std::make_pair(Interval_t::right_open(160, 180), s);
std::cout << "map with 5 partially removed:" << std::endl;
std::cout << m << std::endl;
// completelly remove 6
s = IDSet_t();
s.insert(6);
// Note: maybe the range of the interval could be shorter if you can somehow obtain the minimum and maximum times
m -= std::make_pair(Interval_t::right_open(0, UINT_MAX), s);
std::cout << "map without 6: " << std::endl;
std::cout << m << std::endl;
// remove a time interval
m -= Interval_t::right_open(160, 170);
std::cout << "map with time span removed: " << std::endl;
std::cout << m << std::endl;
return 0;
}
用 g++ 4.4.7 编译:
g++ -Wall -Wextra -std=c++98 -I /usr/include/boost148/ interval_map_mwe.cpp
我得到的输出是
Initial map:
{([100,150)->{1 2 })([150,200)->{1 2 5 6 })([200,250)->{3 4 5 6 })([250,300)->{3 4 })}
Interval that covers 175: [150,200)
Ids in interval: (1,2,5,6)
map with 5 partially removed:
{([100,150)->{1 2 })([150,160)->{1 2 5 6 })([160,180)->{1 2 6 })([180,200)->{1 2 5 6 })([200,250)->{3 4 5 6 })([250,300)->{3 4 })}
map without 6:
{([100,150)->{1 2 })([150,160)->{1 2 5 })([160,180)->{1 2 })([180,200)->{1 2 5 })([200,250)->{3 4 5 })([250,300)->{3 4 })}
map with time span removed:
{([100,150)->{1 2 })([150,160)->{1 2 5 })([170,180)->{1 2 })([180,200)->{1 2 5 })([200,250)->{3 4 5 })([250,300)->{3 4 })}
注意: MWE 中的数字可以认为是随机的。我发现用小数字更容易推理这个例子。
关于c++ - Boost c++ 库 interval_map 是否支持删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16930229/
Boost ICL interval_set 可以加入 right-open 间隔,这些间隔在将它们添加到集合时相互接触。例如,区间 [0,4) 和 [4,8) 将合并成为区间 [0,8)。 这对于
在我目前的项目processes中,可区分的区间,需要合并,如果它们是相邻的。 为此,我想使用出色的 boost::icl 库。每个进程都可以通过它的 id 来唯一标识。 首先,我在我的 interv
我将 boost::icl::interval_maps 与 int interval 一起使用,我想知道如何获取属于一些间隔? 例如,如果我们有一个具有以下结构的区间图 [0, 5): ["A1",
我已经开始使用 boost:icl 库,它非常全面且方便。我主要使用来自 boost 的两种类型的间隔,boost::icl::interval_set 和 boost::icl::interval_
回答问题:Previous Answer: rectangle overlap 我正在使用 interval_map 如下:我有一组由 R = [int start, int end, (int To
我可以通过遍历区间来确定 interval_map 中有多少个区间,但是是否有更直接的方法来获取区间图中的区间数? boost::icl::interval_map 的 size() 方法似乎没有返回
尝试遵循 interval_map 的 boost_party 示例,我制作了这个示例代码: #include "boost/icl/interval.hpp" #include "boost/icl
我很难理解 interval_map 和 split_interval_map,我都实现了,结果是一样的。下面是分割区间图的代码。 #include #include #include usin
我想做的是有效地处理间隔。例如,在我的示例中,间隔如下所示: [10, 20], [15, 25], [40, 100], [5, 14] 区间是封闭的整数,有些区间可能重叠。我想高效 为给定查询找到
下面的代码应该将关联值为 0 和 1 的两个区间插入到 Boost 区间图中,但它只插入了一个: #include #include using Interval = boost::icl::in
我正在尝试使用 boost::icl::interval_map具有自定义间隔 MyInterval和封闭边界( interval_bounds::static_closed ),类似于 interv
是否有一种内置方法来获取 boost::icl::interval_map 中的间隔数?我在文档中找不到它。 size() 方法似乎有不同的用途。 最佳答案 interval_count 不起作用?
interval_map (in icl) 库是否支持删除?我可以根据迭代器查找范围并删除范围吗? ============ 来自 boost 示例的 party.cpp ==============
是否可以制作interval_map具有以下累积行为: [1..3]->1 + [2..4]->2 + [5..7]->3 + [6..8]->4 = [1..4]->{1,2}, [5..8]->{
我正在使用 boost::icl::interval_map 将字节范围映射到一组字符串。该 map 是从(排序的)磁盘文件加载的,然后我使用下面的代码进行查找。 问题是查找真的很慢。 在我的测试中,
我正在使用 BOOST 库中的 interval_map。 typedef set Tpopulations; interval_map populations; 假设我在人群中有这个 [100
我是一名优秀的程序员,十分优秀!