如何从“不相交集合”中获取所有元素的列表。

时间:2014-11-08 06:12:00

标签: c++ boost disjoint-sets

在我的问题中,我有一堆元素(类元素)。说我有1000个元素。这些元素最初是不相关的,这意味着它们属于自己的集合。

稍后我需要使用union操作根据我的程序流合并其中一些集合。 我计划使用boost库的disjoint_set(http://www.boost.org/doc/libs/1_57_0/libs/disjoint_sets/disjoint_sets.html

我的问题是如何在给定代表的集合中列出元素。

disjoint_set是此类任务的最佳数据结构。那么我应该考虑使用别的东西吗?

1 个答案:

答案 0 :(得分:0)

从你的散文描述中,我得不到这些集合实际上会形成任何图形的信息。

如果您只想将Elements与一组相关联,我建议

std::map<ElementId, SetId>

(如果您知道指针保持有效,则ElementId可能只是Element*

如果您还希望能够有效地查询逆转

bimap<Element, bimaps::multiset_of<SetId> >

将成为候选人。观看演示 Live On Coliru ¹

#include <boost/range/iterator_range.hpp>
#include <boost/bimap/multiset_of.hpp>
#include <boost/bimap.hpp>
#include <iostream>

using namespace boost;

int main() {
    using Element = int; // for simplicity :)
    using SetId   = int;
    using Sets = bimap<Element, bimaps::multiset_of<SetId> >;

    Sets sets;
    sets.insert({ Element(1), 300 });
    sets.insert({ Element(2), 300 });
    sets.insert({ Element(3), 400 });
    sets.insert({ Element(4), 300 });

    // give us set #300
    for (auto& e : make_iterator_range(sets.right.equal_range(300)))
        std::cout << e.first << " - Element(" << e.second << ")\n";
}

打印

300 - Element(1)
300 - Element(2)
300 - Element(4)

¹Coliru似乎失败了。稍后会添加