- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我目前的项目processes中,可区分的区间,需要合并,如果它们是相邻的。
为此,我想使用出色的 boost::icl
库。每个进程都可以通过它的 id 来唯一标识。
首先,我在我的 interval_map
中添加了一些间隔。现在我想完成两件事:
这是我到目前为止得到的:
#include <iostream>
#include <set>
#include <boost/icl/interval_map.hpp>
#include "boost/icl/closed_interval.hpp"
struct Process {
int id;
};
bool operator==(const Process& p, const Process& q) {
return p.id == q.id;
}
bool operator<(const Process& p, const Process& q) {
return p.id < q.id;
}
std::ostream& operator<<(std::ostream& str, const Process& p) {
str << "Process{" << p.id << "}";
return str;
}
int main(int, char**) {
using namespace boost::icl;
interval_map<double, std::set<Process>> imap;
imap.add({ interval<double>::closed(0., 4.),{ Process{ 4 } } });
imap.add({ interval<double>::closed(2., 6.),{ Process{ 1 } } });
imap.add({ interval<double>::closed(4., 9.),{ Process{ 4 } } });
imap.add({ interval<double>::closed(8., 8.),{ Process{ 7 } } });
for (auto&& iter : imap) {
std::cout << iter.first << " - " << iter.second<< std::endl;
}
for (auto iter : find(imap, { Process{4} })) { // How to implement find on codomain
// Should print:
// [0.,4.] - { Process{4}}
// [4.,9.] - { Process{4}}
std::cout << iter.first << " - " << iter.second << std::endl;
}
}
最佳答案
首先,观察,由于区间是闭合的,[0,4]
和 [4,6]
实际上相邻,但重叠。您是说 right_open
吗?
其次,区间映射建模一个函数,映射不保证是injective .
在您示例的有限范围内,您似乎宁愿反转数据结构,以达到:
#include "boost/icl/closed_interval.hpp"
#include <boost/icl/interval_map.hpp>
#include <iostream>
#include <set>
#include <map>
struct Process {
int id;
friend bool operator==(const Process& p, const Process& q) { return p.id == q.id; }
friend bool operator<(const Process& p, const Process& q) { return p.id < q.id; }
friend std::ostream& operator<<(std::ostream& str, const Process& p) {
return str << "Process{" << p.id << "}";
}
};
int main(int, char**) {
using namespace boost::icl;
using Map = std::map<Process, boost::icl::interval_set<double> >; // instead of boost::icl::interval_map<double, std::set<Process> >;
using IVal = Map::mapped_type::interval_type;
Map imap;
imap[{4}] += IVal::right_open(0, 4);
imap[{1}] += IVal::right_open(2, 6);
imap[{4}] += IVal::right_open(4, 9);
imap[{7}] += IVal::closed(8, 8);
//for (auto&& el : imap) { std::cout << el.first << " - " << el.second << std::endl; }
Process key{4};
std::cout << key << " - " << imap[key];
}
这导致:
Process{4} - {[0,9)}
我认为您的意思是“以自动完成重叠间隔合并的方式”。
当然,您可以从原始数据结构中推导出逆映射:
template <typename IMap>
auto inverted(IMap const& imap) {
std::map<typename IMap::codomain_type::value_type, boost::icl::interval_set<typename IMap::domain_type> > output;
for (auto& el : imap)
for (auto& key: el.second)
output[key] += el.first;
return output;
}
#include "boost/icl/closed_interval.hpp"
#include <boost/icl/interval_map.hpp>
#include <iostream>
#include <set>
struct Process {
int id;
friend bool operator==(const Process& p, const Process& q) { return p.id == q.id; }
friend bool operator<(const Process& p, const Process& q) { return p.id < q.id; }
};
std::ostream& operator<<(std::ostream& str, const Process& p) {
str << "Process{" << p.id << "}";
return str;
}
template <typename IMap>
auto inverted(IMap const& imap) {
std::map<typename IMap::codomain_type::value_type, boost::icl::interval_set<typename IMap::domain_type> > output;
for (auto& el : imap)
for (auto& key: el.second)
output[key] += el.first;
return output;
}
int main(int, char**) {
using namespace boost::icl;
using IMap = boost::icl::interval_map<double, std::set<Process> >;
using IVal = IMap::interval_type;
IMap imap;
imap.add({ IVal::right_open(0, 4), {Process{ 4 }} });
imap.add({ IVal::right_open(2, 6), {Process{ 1 }} });
imap.add({ IVal::right_open(4, 9), {Process{ 4 }} });
imap.add({ IVal::closed(8, 8), {Process{ 7 }} });
std::cout << imap << "\n\n";
for (auto&& iter : imap) {
std::cout << iter.first << " - " << iter.second << std::endl;
}
Process key{4};
std::cout << key << " - " << inverted(imap)[key] << "\n";
}
直接支持查询域中的多个键,请在此处查看各种指针:
您始终可以构建自己的数据结构来提供双向索引,例如所示
关于c++ - interval_map codomain 中的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51768007/
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
我是一名优秀的程序员,十分优秀!