2012-11-16 23 views
9

İki A ve B kümesi a ve b öğelerine sahibiz. Şimdi bunlar birbirleriyle ilişkilidir (0..1: n anadallık), böylece her bir öğenin B'de en fazla bir ortağı vardır. ve her b'nin A. ( A) 'daki maddelere birkaç (en az bir) dernek bir tam sayı çiftidir ve B tamsayılardır.C++ iki yönlü rasgele erişim için verimli veri yapısı

Böyle bir "çift yönlü" haritayı depolamanın etkili bir yolu var mı?

map<pair<unsigned int, unsigned int>, unsigned int> AtoB 
map<unsigned int, vector<pair<unsigned int, unsigned int> > > BtoA 

Ama belki de bu daha verimli başa iyi bir yol vardır: Basit bir yaklaşım iki haritayı kullanmak olacaktır. Yardımlarınız

cevap

7

Yükseltme, bununla ilgilenmek için iki kitaplık içerir: Boost.Bimap ve Boost.MultiIndex. Birincisi, bilişsel ("çift yönlü") haritalar problemine özeldir, ikincisi ise daha geneldir ve keyfi indeksleri olan bir bellek içi veritabanına benzer bir şey uygular.

unsigned int anahtarlarınızın eşlerinizle benzersiz bir şekilde eşleşmediği göz önüne alındığında, MultiIndex'in daha fazla olduğunu düşünüyorum. Ben geçen bu kitaplığı kullandım yana uzun bir zaman, ama Kuvvetlendirme kullanmak istemiyorsanız öğretici bakarak, o zaman en azından mevcut kurulum kolaylaştırabilirsiniz,

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; 

gibi bir şey gerekir std::multimap<unsigned, std::pair<unsigned, unsigned>> tarafından,

map<unsigned int, vector<pair<unsigned int, unsigned int> > > 

değiştirilerek.

1

Harita ve Multimap, O (log n) verimliliğine sahiptir, bu yüzden, verilerinizi depolamanın en iyi yoludur. Ben,

kullanmanızı öneririz.