2013-10-05 2 views
9

Sto usando intervallo_map dalla libreria BOOST.Il boost interval_map ha il metodo operator [] o .at()?

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

Dire che ho questo popolazioni

[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, 

Ora voglio scoprire che cosa è mappato su qualche numero: mi sarei aspettato qualcosa di simile:

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

o

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

Tuttavia non sembra di trovare alcun metodo del genere.

Devo davvero definire una mappa di intervalli come "finestra" e fare l'intersezione? Qualcosa di simile:

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

Scherzi a parte nessuno ha rispondere? Per favore, potrei davvero usare qualche risposta: -/ – user2848463

risposta

7

No, il boost::icl::interval_map non contiene queste funzioni di accesso elemento. Tuttavia puoi fare quello che vuoi, usando la funzione find.

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; 
... 

Il codice di cui sopra vi darà intervallo, che contiene il numero 1006313. Per inviare std::set<int> al cout avrete bisogno operatore alla:

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; 
} 

Poi la riga sotto stamperà cosa vuoi:

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

Grazie! Ad ogni modo, in qualche modo ho perso il metodo find che restituisce iteratore. – user2848463

1

Sì, una soluzione semplice sarebbe quella di trovare il tuo elemento mappato con(). Tuttavia, per fare ciò devi impostare la tua caratteristica della mappa = total_absorber in modo da coprire l'intera gamma. Ecco il codice:

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

si sarebbe poi iterare su valSet o ignorare la operator<< come @HEKTO detto sopra per stampare in realtà i vostri dati.

Check the boost documents for selection on interval_map. Questo metodo dà anche il miglior rendimento atteso di O (log (N))