2017-02-02 7 views
0

繰り返し要素のすべてのキーにアクセスする場合はbimapにします。私はいくつかのサンプルコードを持っていますbimapで繰り返される要素のすべてのキーを見つける

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

namespace bimaps = boost::bimaps; 
typedef boost::bimap<bimaps::set_of<unsigned long int>, 
     bimaps::multiset_of<unsigned long int > > bimap_reference; 
typedef bimap_reference::value_type position; 
bimap_reference numbers; 

int main() 
{ 
    numbers.insert(position(123456, 100000)); 
    numbers.insert(position(234567, 80000)); 
    numbers.insert(position(345678, 100000)); 
    numbers.insert(position(456789, 80000)); 


    auto it = numbers.right.find(100000); 
    std::cout<<"numbers:"<<it->first<<"<->"<<it->second<<std::endl; 
    return 0; 
} 

上記のコードでは、私は右側に要素を繰り返しています。上記のコードは、私に要素100000、i、eの123456 <--> 100000の最初のキーを与えます。しかし、要素100000のエントリがもう1つあります。繰り返し要素のすべてのキーにアクセスする方法(要素は、左側に一意のキーで複数回存在する可能性があります)。

答えて

2

右側にmultiset::equal_rangeを使用してください。

このようにして、最初のオカレンスから最後のオカレーターまでのイテレーターの範囲を取得し、次にイテレートする必要があります。

using ritr = bimap_reference::right_const_iterator; 

std::pair<ritr, ritr> range = numbers.right.equal_range(100000); 

for (auto itr = range.first; itr != range.second; ++itr) 
{ 
     ... 
} 


編集:

using ritr文では、実際の型のためritrエイリアスを作ります。これは、より高いレベルを使用するtypedefに相当します。

エイリアスは、std :: pair宣言で実際の型名を2回タイプインした場合より次の行を読みやすくしています。

さらに簡単な解決方法は、autoを使用することです。

equal_rangeは、バイマップの右側にあるマルチセットのメンバー関数です。これは、通常の方法で反復するために、指定されたキーと等しいマルチセットの要素の開始イテレータと終了イテレータを含むstd :: pairを返します。

+0

あなたの答えをありがとうが、それは最初の場所だけを与えます。 http://cpp.sh/8j74i – AwaitedOne

+0

上記のコードで '100000' i、e' 123456 <--> 100000'と '345678 <--> 100000'の両方のキーを取得する必要があります。これは' 123456 <--> 100000'です。最初の場所。 – AwaitedOne

+0

いいえ、オンラインコードの例に重複はありません。あなたはタイプミスがあります。タイプミスを修正すると、両方の場所が表示されます。 – acraig5075

関連する問題