提升不相交集
Boost disjoint set
我需要制作一个类型为dataum
的不相交集。
我有向量中的所有数据,如下
vector<dataum> S;
S.push_back( dataum(0,0) );
S.push_back( dataum(0,1) );
S.push_back( dataum(0,2) );
.
.
然后我创建dissect_set
std::vector<int> rank (100);
std::vector<dataum> parent (100);
boost::disjoint_sets<int*,dataum*> ds(&rank[0], &parent[0]);
for( int i=0 ; i<S.size() ; i++ )
{
ds.make_set( S[i] );
}
这似乎不起作用。我错过了什么?我想创建一个具有自定义数据类型的不相交集。在这种情况下,dataum
。最初,我的每个dataums
都应该在不同的集合中。
文档指出
Rank
必须是具有整数值类型和等于集合元素类型的键类型的ReadWritePropertyMap
的模型Parent
必须是ReadWritePropertyMap
的模型,并且键和值类型与集合的元素类型相同
在你之前的问题中,我在评论中发布了以下示例代码:
在看了(对我来说是新的)
disjoint_set_*
类之后,我认为它们不能迭代集合的成员。它们的作用类似于从元素到集合代表的单向映射。如果它对您有帮助:http://paste.ubuntu.com/8881626–9小时前
它在这里,为想象中的dataum
类型重新设计:
struct dataum {
int x,y;
bool operator< (const dataum& o) const { return tie(x,y) < tie(o.x,o.y); }
bool operator==(const dataum& o) const { return tie(x,y) == tie(o.x,o.y); }
bool operator!=(const dataum& o) const { return tie(x,y) != tie(o.x,o.y); }
};
以下是我如何看到它的disjoint_set
声明:
std::map<dataum,int> rank;
std::map<dataum,dataum> parent;
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));
这方面的机制可以在Boost PropertyMap的文档中找到,它是一个非常强大的通用数据结构抽象层,主要与Boost Graph Library一起使用。它非常强大,但我不能说它对用户友好。
这是完整的演示在Coliru上直播
#include <boost/pending/disjoint_sets.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/tuple/tuple_comparison.hpp>
#include <iostream>
#include <map>
#include <cassert>
using namespace boost;
struct dataum {
int x,y;
bool operator< (const dataum& o) const { return tie(x,y) < tie(o.x,o.y); }
bool operator==(const dataum& o) const { return tie(x,y) == tie(o.x,o.y); }
bool operator!=(const dataum& o) const { return tie(x,y) != tie(o.x,o.y); }
};
int main() {
std::vector<dataum> S { {0,0}, {0,1}, {0,2} };
std::map<dataum,int> rank;
std::map<dataum,dataum> parent;
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));
for(auto i=0ul; i<S.size(); i++)
ds.make_set(S[i]);
assert((ds.count_sets(S.begin(), S.end()) == 3));
assert((ds.find_set(dataum{0,2}) == dataum{0,2}));
assert((ds.find_set(dataum{0,1}) == dataum{0,1}));
ds.union_set(dataum{0,2},dataum{0,1});
assert((ds.count_sets(S.begin(), S.end()) == 2));
assert((ds.find_set(dataum{0,2}) == dataum{0,1}));
assert((ds.find_set(dataum{0,1}) == dataum{0,1}));
std::cout << "done";
}
1.3.3 Coliru仍未与合作
相关文章:
- 没有找到相关文章