在我的问题中,我有一堆元素(类元素)。说我有1000个元素。这些元素最初是不相关的,这意味着它们属于自己的集合。
稍后我需要使用union操作根据我的程序流合并其中一些集合。 我计划使用boost库的disjoint_set(http://www.boost.org/doc/libs/1_57_0/libs/disjoint_sets/disjoint_sets.html)
我的问题是如何在给定代表的集合中列出元素。
disjoint_set是此类任务的最佳数据结构。那么我应该考虑使用别的东西吗?
答案 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似乎失败了。稍后会添加