2012-08-29 124 views
15

問題的第一部分是我嘗試使用boost :: bimap,但從文檔中我不清楚如何定義雙向多映射。Boost :: Bimap相當於雙向多映射

問題的第二部分是我需要它是一個方向的地圖和另一個方向的多地圖,這可以使用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答案是你的問題的第一部分完全正確(如何定義一個雙向多重映射?)。

對於第二部分(訪問一個方向上的地圖bimap和另一個方向上的多個地圖)它是不正確的。

正確的方式來訪問將是[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使用find()被初始化到multimap中間的某個地方。如果使用begin()進行初始化,則所有三個對都可以正確打印。 – namezero

+1

是的,但這裏的重點不是打印三對。重點是訪問bimap(從左側和/或從右側)並檢索給定鍵的對。我編輯了我的回覆,其中包括一個可以通過使用equal_range來完成此操作的示例。我希望這有幫助。 –

+0

@JavierBravo更新這個答案的榮譽。然而,你確實完全錯過了這個情節:** [Live On Coliru](http://coliru.stacked-crooked.com/a/39ddf19cff3e97d8)** – sehe