2012-08-29 10 views
15

प्रश्न का पहला भाग यह है कि मैं बूस्ट :: बिमाप का उपयोग करने की कोशिश कर रहा हूं, लेकिन दस्तावेज़ीकरण से यह स्पष्ट नहीं है कि एक बिडरेक्शनल मल्टीमैप को कैसे परिभाषित किया जाए।बूस्ट :: बिडैपक्शनल मल्टीमैप

प्रश्न का दूसरा भाग यह है कि मुझे इसे एक दिशा में एक मानचित्र और दूसरी दिशा में एक मल्टीमैप की आवश्यकता है, क्या यह boost :: bimap का उपयोग करके किया जा सकता है?

क्या किसी को इसका अनुभव है या मुझे सही पृष्ठ पर इंगित कर सकता है?

उत्तर

15

सभी दस्तावेज में है ... http://www.boost.org/doc/libs/1_51_0/libs/bimap/doc/html/boost_bimap/the_tutorial/discovering_the_bimap_framework.html

typedef boost::bimap<bimaps::multiset_of<int>, bimaps::set_of<int>> bimap_t; 

उदाहरण।

#include <iostream> 
#include <boost/bimap.hpp> 
#include <boost/bimap/set_of.hpp> 
#include <boost/bimap/multiset_of.hpp> 

namespace bimaps = boost::bimaps; 

int main() 
{ 
    typedef boost::bimap<bimaps::multiset_of<int>, bimaps::set_of<int>> bimap_t; 
    typedef bimap_t::value_type value_type; 
    bimap_t bimap; 
    bimap.insert(value_type(1, 1)); 
    bimap.insert(value_type(1, 2)); 
    auto& left = bimap.left; 
    auto it = left.find(1); 
    std::cout << "LEFT" << std::endl; 
    for (; it != left.end(); ++it) 
    { 
     std::cout << it->first << " " << it->second << std::endl; 
    } 
    auto& right = bimap.right; 
    auto r_it = right.find(2); 
    std::cout << "RIGHT" << std::endl; 
    for (; r_it != right.end(); ++r_it) 
    { 
     std::cout << r_it->first << " " << r_it->second << std::endl; 
    } 
} 
9

ForEverR से उत्तर आपके प्रश्न के पहले भाग के लिए आंशिक रूप से सही है (कैसे एक द्विदिश मल्टीमैप परिभाषित करने के लिए?)।

दूसरे भाग के लिए (एक दिशा में एक मानचित्र है जो एक दिशा में एक नक्शा है और दूसरी दिशा में एक मल्टीमैप है) यह सही नहीं है।

उपयोग करने के लिए एक सही तरीका [http://rextester.com/BXBDHN12336] होगा:

//bimap operations 

#include <boost/bimap.hpp> 
#include <boost/bimap/set_of.hpp> 
#include <boost/bimap/multiset_of.hpp> 

int main() 
{ 
    typedef boost::bimap<boost::bimaps::multiset_of<int>, boost::bimaps::set_of<int>> bimap_t; 
    typedef bimap_t::value_type value_type; 
    bimap_t bimap; 
    bimap.insert(value_type(1, 1)); 
    bimap.insert(value_type(10, 50)); 
    bimap.insert(value_type(1, 2)); 
    bimap.insert(value_type(9, 15)); 

    typedef bimap_t::left_const_iterator l_itr_t; 
    typedef std::pair<l_itr_t,l_itr_t> l_itr_range_t; 

    l_itr_range_t ii = bimap.left.equal_range(1); 

    std::cout << "LEFT" << std::endl;   
    for(l_itr_t it = ii.first; it != ii.second; ++it) 
    { 
    std::cout << "Key = " << it->first << " Value = " << it->second << std::endl; 
    } 

    std::cout << "RIGHT" << std::endl; 
    std::cout << "Key = " << 1 << " Value = " << bimap.right.at(1) << std::endl; 
} 

stdout: 
LEFT 
Key = 1 Value = 1 
Key = 1 Value = 2 
RIGHT 
Key = 1 Value = 1 

ForEverR से उदाहरण डाला डेटा के आदेश की वजह से काम लेकिन जब आप में एक और जोड़े को सम्मिलित परिणाम की जाँच करने के लिए 'लगता है' अंत bimap.insert (value_type (9, 15)) ;:

#include <iostream> 
#include <boost/bimap.hpp> 
#include <boost/bimap/set_of.hpp> 
#include <boost/bimap/multiset_of.hpp> 

namespace bimaps = boost::bimaps; 

int main() 
{ 
    typedef boost::bimap<bimaps::multiset_of<int>, bimaps::set_of<int>> bimap_t; 
    typedef bimap_t::value_type value_type; 
    bimap_t bimap; 
    bimap.insert(value_type(1, 1)); 
    bimap.insert(value_type(1, 2)); 
    bimap.insert(value_type(9, 15)); 
    auto& left = bimap.left; 
    auto it = left.find(1); 
    std::cout << "LEFT" << std::endl; 
    for (; it != left.end(); ++it) 
    { 
     std::cout << it->first << " " << it->second << std::endl; 
    } 
    auto& right = bimap.right; 
    auto r_it = right.find(2); 
    std::cout << "RIGHT" << std::endl; 
    for (; r_it != right.end(); ++r_it) 
    { 
     std::cout << r_it->first << " " << r_it->second << std::endl; 
    } 
} 

stdout: 
LEFT 
1 1 
1 2 
9 15 
RIGHT 
2 1 
15 9 
+1

मुझे यकीन नहीं है कि "काम करने के लिए आपका क्या मतलब है" के साथ आपका क्या मतलब है। आपके द्वारा प्राप्त किया जा रहा आउटपुट इसलिए है क्योंकि यह और r_it को मल्टीमैप के मध्य में कहीं भी() के साथ प्रारंभ किया जाता है। यदि शुरू() के साथ शुरू किया गया है, तो सभी तीन जोड़े ठीक से प्रिंट करते हैं। – namezero

+1

हां, लेकिन यहां बिंदु तीन जोड़े मुद्रित नहीं है। बिंदु बिमाप (बाएं और/या दाएं से) तक पहुंचने और किसी दिए गए कुंजी के लिए जोड़े को पुनर्प्राप्त करना है। मैंने अपनी प्रतिक्रिया को एक उदाहरण सहित संपादित किया है जहां आप बराबर_रेेंज का उपयोग कर इसे पूरा कर सकते हैं। आशा है कि ये आपकी मदद करेगा। इस उत्तर को अद्यतन करने के लिए –

+0

@JavierBravo kudos। हालांकि, वास्तव में आप पूरी तरह से साजिश को याद करते हैं: ** [लाइव ऑन कॉलिरू] (http://coliru.stacked-crooked.com/a/39ddf19cff3e97d8) ** – sehe

संबंधित मुद्दे