我正在尝试使用boost:disjoint_sets用于非重叠间隔(在我的情况下,集合中的间隔必须在其成员之间没有交集),由以下结构表示:
struct dataum {
int x,y;
bool operator< (const dataum& o) const { return y < o.x ; }
bool operator==(const dataum& o) const {
if(x <= o.x && o.x <= y && y <= o.y )
return true;
if(x <= o.x && o.y <= y)
return true;
if(o.x <= x && y <= o.y)
return true;
if(o.x <= x && x <= o.y && o.y <= y )
return true;
return false;
}
bool operator!=(const dataum& o) const {
return !operator==(o);
}
};
假设我有一个间隔列表,例如([1,3],[4,5],[6,10],[8,9])。我初始化一个不相交的集合如下:
boost::disjoint_sets<
associative_property_map<std::map<dataum,int>>,
associative_property_map<std::map<dataum,dataum>> > ds(
make_assoc_property_map(rank),
make_assoc_property_map(parent));
然后我在列表的所有元素中执行make_set,这将导致4个不相交的集合,对吧?在此之后,我执行以下操作:
std::cout << ds.count_sets(S.begin(), S.end()) << std::endl;
ds.union_set(S[0],S[1]);
ds.union_set(S[1],S[2]);
std::cout << ds.count_sets(S.begin(), S.end()) << std::endl;
我不明白为什么最后一个cout说我只有一套,在我的理解中应该说我有2套{[1,3],[4,5],[6,10] ]}和{[8,9]}。
任何人都可以帮我理解发生了什么吗?
答案 0 :(得分:0)
我不完全确定我会得到你想要做的,但是看看Boost ICL:
<强> Live On Coliru 强>
#include <boost/icl/split_interval_set.hpp>
#include <iostream>
using dset = boost::icl::split_interval_set<int>;
using dataum = dset::interval_type;
int main() {
dset data;
for (auto i : {
dataum::closed (1,3),
dataum::closed (4,5),
dataum::closed (6,10),
dataum::closed (8,9),
})
{
data.insert(i);
std::cout << data << "\n";
}
}
输出
{[1,3]}
{[1,3][4,5]}
{[1,3][4,5][6,10]}
{[1,3][4,5][6,8)[8,9](9,10]}