c ++用于双向随机访问的高效数据结构

时间:2012-11-16 09:45:28

标签: c++ data-structures map

我有两组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

但也许有更好的方法来更有效地处理这个问题。

感谢您的帮助

3 个答案:

答案 0 :(得分:7)

Boost包含两个处理此问题的库:Boost.BimapBoost.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