我有两组A和B的元素a和b。现在它们彼此相关(0..1:n基数),所以每个a在B中最多只有一个伙伴,每个b可以有几个(在至少一个)与A中的项目的关联。 A是一组整数对,B是整数。
有没有有效的方法来存储这样的“双向”地图? 一种简单的方法是使用两张地图:
map<pair<unsigned int, unsigned int>, unsigned int> AtoB
map<unsigned int, vector<pair<unsigned int, unsigned int> > > BtoA
但也许有更好的方法来更有效地处理这个问题。
感谢您的帮助
答案 0 :(得分:7)
Boost包含两个处理此问题的库:Boost.Bimap和Boost.MultiIndex。前者是特定于双向(“双向”)映射的问题,而第二种是更通用的,并且实现类似于具有任意索引的内存数据库的东西。
鉴于您的unsigned int
密钥没有唯一映射到您的对,我认为MultiIndex更有序。自从我上次使用这个库以来已经有很长一段时间了,但是看一下教程,你需要像
struct YourData {
unsigned key;
std::pair<unsigned, unsigned> value;
};
typedef multi_index_container<
YourData,
indexed_by<
ordered_non_unique<member<YourData, unsigned, &YourData::key> >,
ordered_unique<member<YourData, std::pair<unsigned, unsigned>,
&YourData::value> >
>
> YourContainer;
如果您不想使用Boost,那么您至少可以通过替换
来简化当前的设置map<unsigned int, vector<pair<unsigned int, unsigned int> > >
由std::multimap<unsigned, std::pair<unsigned, unsigned>>
。
答案 1 :(得分:2)
boost::bimap
怎么样? http://www.boost.org/doc/libs/1_47_0/libs/bimap/doc/html/index.html我认为这是给你的。
答案 2 :(得分:1)
Map和Multimap的效率为O(log n),因此,我认为这是存储数据的最佳方式。我建议使用
map<pair<unsigned int, unsigned int>, unsigned int> AtoB
multimap<pair<unsigned int, unsigned int>, unsigned int> BtoA