2012-11-08 16 views
9

मैं boost::range लाइब्रेरी के माध्यम से जा रहा हूं और बढ़ावा दिया :: range_iterator और boost::iterator_range। मैं यहां इन शर्तों से उलझन में हूं। क्या कोई यह बता सकता है कि दो के बीच क्या अंतर है और कब उपयोग करना है? साथ ही, यह अच्छा होगा अगर आप मुझे नमूना उदाहरणों पर इंगित कर सकें जहां बूस्ट रेंज लाइब्रेरी का उपयोग दस्तावेज के अलावा इसके बारे में अधिक जानने के लिए किया जाता है। धन्यवादboost :: range_iterator और boost :: iterator_range भ्रम

उत्तर

7

क्या कोई यह बता सकता है कि दो के बीच क्या अंतर है और क्या उपयोग करना है?

range_iterator निम्नलिखित तरीके से सीमा इटरेटर के प्रकार के प्राप्त करने के लिए प्रयोग किया जाता है:

range_iterator<SomeRange>::type 

यह std::iterator_traits के लिए कुछ में simillar। मसलन, आप पुनरावर्तक से मान प्रकार प्राप्त कर सकते हैं:

std::iterator_traits<int*>::value_type 

iterator_range पर्वतमाला के बीच और iterators पुल नहीं है। उदाहरण के लिए - आपके पास इटरेटर की जोड़ी है, और आप उन्हें एल्गोरिदम में भेजना चाहते हैं जो केवल श्रेणियों को स्वीकार करता है। उस स्थिति में आप iterator_range का उपयोग करके अपने इटरेटर को रेंज में लपेट सकते हैं। या बेहतर - make_iterator_range - यह प्रकार अनुमान करने में मदद मिलेगी (एसटीडी की तरह :: make_pair करता है):

make_iterator_range(iterator1,iterator2) 

रिटर्न सीमा होती है।

live demo

#include <boost/range/iterator_range.hpp> 
#include <boost/range/algorithm.hpp> 
#include <boost/range/iterator.hpp> 
#include <typeinfo> 
#include <iostream> 
#include <ostream> 

using namespace boost; 
using namespace std; 

struct print 
{ 
    template<typename T> 
    void operator()(const T &t) const 
    { 
     cout << t << " "; 
    } 
}; 

int main() 
{ 
    typedef int Array[20]; 
    cout << typeid(range_iterator<Array>::type).name() << endl; 

    Array arr={11,22,33,44,55,66,77,88}; 
    boost::for_each(make_iterator_range(arr,arr+5) ,print()); 
} 

इसके अलावा, यह अच्छा होगा अगर तुम मुझे इंगित कर सकते हैं उदाहरण के नमूने के लिए जहां बढ़ावा रेंज पुस्तकालय से अलग इस बारे में अधिक पता करने के लिए प्रयोग किया जाता है:

उदाहरण निम्नलिखित पर विचार करें प्रलेखन

त्वरित सारांश के लिए - जाँच this slides

012,351,
3

आम तौर पर, आप सीधे boost::range_iterator का उपयोग नहीं करेंगे, क्योंकि यह एक टेम्पलेट मेटाफंक्शन है जो सीमा प्रदान करता है (सीमा के प्रकार के बावजूद), और इसके प्रारंभ()/end() विधियों के प्रकार को लौटाता है।

boost::iterator_range का उपयोग पूर्व-मौजूदा इटरेटर्स की एक जोड़ी से नई सीमा बनाने के लिए किया जाता है। यह आमतौर पर उपयोग करने की अधिक संभावना होगी, आमतौर पर कोड लेते समय जो अभी भी इटेटरेटर आधारित है और इसका उपयोग किसी श्रेणी में कनवर्ट करने के लिए किया जाता है।

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