2013-10-05 2 views
9

मैं बूस्ट पुस्तकालय से interval_map का उपयोग कर रहा हूं।क्या interval_map को ऑपरेटर [] या .at() विधि को बढ़ावा देता है?

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[1006313]; // 1611,1653 

या

: मैं की तरह कुछ उम्मीद करेंगे
cout << populations.at(1006313); // 1611,1653 

हालांकि मुझे ऐसा कोई तरीका नहीं दिख रहा है।

क्या मुझे वास्तव में "खिड़की" के रूप में Anoher अंतराल मानचित्र को परिभाषित करने और चौराहे करने की आवश्यकता है? की तरह कुछ:

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

गंभीरता से कोई भी जवाब देने की है हे (लॉग (एन)) का सबसे अच्छा उम्मीद प्रदर्शन देता है? कृपया, मैं वास्तव में कुछ जवाब का उपयोग कर सकता हूं: -/ – user2848463

उत्तर

7

नहीं है, boost::icl::interval_map इन तत्व पहुंच कार्यों शामिल नहीं है। हालांकि आप 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; 
... 

कोड ऊपर आप अंतराल दे देंगे, जो संख्या 1006313. शामिल आदेश cout को std::set<int> भेजने के लिए आप अतिरिक्त ऑपरेटर की आवश्यकता होगी:

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

धन्यवाद! वैसे भी, किसी भी तरह से मैंने विधि को याद किया जो इटेटरेटर लौटाता है। – user2848463

1

हां, एक सरल समाधान आपके मैप किए गए तत्व को() के साथ ढूंढना होगा। हालांकि, ऐसा करने के लिए आपको अपना नक्शा विशेषता = total_absorber सेट करना होगा ताकि आप पूरी श्रृंखला को कवर कर सकें।

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

फिर आप valSet से अधिक पुनरावृति या operator<< ओवरराइड के रूप में @HEKTO ऊपर उल्लेख किया है वास्तव में आपके डेटा बाहर मुद्रित करने के लिए होगा: यहाँ कोड है।

Check the boost documents for selection on interval_map. इस विधि भी

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