2013-10-05 13 views
9

私はBOOSTライブラリからinterval_mapを使用しています。boost_interfaceに演算子[]または.at()メソッドがありますか?

cout << populations[1006313]; // 1611,1653 

または

:私のような何かを期待する:

typedef set<int> Tpopulations;  
interval_map<int, Tpopulations> populations; 

は今、私はいくつかの番号にマッピングされているものを知りたい私は集団

[1006311,1006353) 1611,1653, 
[1006353,1006432) 1031,1611,1653, 
[1006432,1006469] 1031,1387,1523,1611,1653, 
(1006469,1006484] 1031,1387,1611,1653, 
(1006484,1006496] 1031,1387,1611, 
(1006496,1006506] 1031,1611, 
(1006506,1006547] 1031, 

でこれを持っていると言います

cout << populations.at(1006313); // 1611,1653 

しかし、私はそのような方法を見つけることはできないようです。

本当に、インターバルマップを「ウィンドウ」として定義して交差を行う必要がありますか?ような何か:

interval_map<int, Tpopulations> window; 
set<int>empty_set; 
window +=(make_pair(1006313,empty_set)); 
cout << populations & window 
+0

が真剣に誰も答えていないO(ログ(N))の最高の期待される性能を提供しますか?してください、私は本当にいくつかの答えを使用することができます: -/ – user2848463

答えて

7

はありません、boost::icl::interval_mapは、これらの要素へのアクセス機能が含まれていません。しかし、find機能を使用して、あなたが望むことをすることができます。あなたは追加の作業が必要ですcoutstd::set<int>を送信するためには数1006313.が含まれてい

typedef std::set<int> Tpopulations; 
typedef boost::icl::interval_map<int, Tpopulations> IMap; 
typedef boost::icl::interval<int> Interval; 
... 
IMap m; 
m += std::make_pair(Interval::right_open(1006311, 1006353), Tpopulations({1611, 1653})); 
... 
IMap::const_iterator it = m.find(1006313); 
cout << it->first << endl; 
... 

コードは、上記の間隔あなたを与えるだろう、:そして、以下の行が印刷されます

inline std::ostream& operator<< (std::ostream& S, const Tpopulations& X) 
{ 
    S << '('; 
    for (ISet::const_iterator it = X.cbegin(); it != X.cend(); ++it) 
    { 
    if (it != X.cbegin()) S << ','; 
    S << *it; 
    } 
    S << ')'; 
    return S; 
} 

を何あなたは欲しい:

cout << it->second << endl; 
+0

ありがとう!とにかく、何とか私はイテレータを返すfindメソッドを見逃しました。 – user2848463

1

はい、単純な解決策は()であなたのマップされた要素を見つけることでしょう。しかし、そうするには、マップのtrait = total_absorberを設定して、全範囲をカバーする必要があります。ここでは、コードは次のようになります。

interval_map<int, Tpopulations, icl::total_absorber> populations; 
Tpopulations valSet = populations(1006313); 

@HEKTOが実際にあなたのデータをプリントアウトするために上記のようにあなたは、その後valSetを反復処理するかoperator<<をオーバーライドします。

Check the boost documents for selection on interval_map. また、このメソッドは、

関連する問題