2011-04-16 11 views
11

मेरे पास मूल्यों का अनुक्रम है जो मैं (iterator begin, iterator end) जोड़ी लेता हूं जो एक फ़ंक्शन को पास करना चाहता हूं। हालांकि, मैं केवल मूल अनुक्रम में संसाधित होने के लिए हर दूसरे तत्व को चाहता हूं।इटेटरेटर छोड़ना

क्या एक इटरेटर मुखौटा बनाने के लिए मानक-लिब/बूस्ट का उपयोग करने का कोई अच्छा तरीका है जो मुझे मूल अनुक्रम में जाने की अनुमति देगा? मैंने कुछ सरल पाया जैसे कि यह पहले से ही बढ़ावा देने वाले या श्रेणी पुस्तकालयों में होगा, लेकिन मुझे कुछ भी नहीं मिला।

या क्या मुझे ऐसा करने का एक और स्पष्ट तरीका याद आ रहा है? बेशक, मुझे पता है कि मेरे पास हमेशा मूल्यों को किसी अन्य अनुक्रम में कॉपी करने का विकल्प होता है, लेकिन यह वह नहीं है जो मैं करना चाहता हूं।

संपादित करें: मुझे filter_iterator के बारे में पता है, लेकिन यह मानों पर फ़िल्टर करता है - यह पुनरावृत्ति की प्रगति के तरीके को नहीं बदलता है।

+0

आईए ने एक ही विषय पर थोड़ा अलग सवाल पूछा: http://stackoverflow.com/questions/3046747/c-stl-selective-iterator, bt मैंने विशेष रूप से कोई बूस्ट का अनुरोध नहीं किया है, तो बहुत उपयोगी नहीं है :( – rubenvb

उत्तर

2

यहां बूस्ट का filter iterator है। यह वही है जो आप चाहते हैं।

अद्यतन: क्षमा करें, गलत तरीके से पढ़ें। यहाँ बूस्ट में सभी इटरेटर funkiness की एक सूची है:

http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/#specialized-adaptors

मुझे लगता है कि एक ओवरलोड operator++ कि अंतर्निहित इटरेटर मूल्य दो बार वृद्धि कर देता है के साथ एक सादे iterator_adaptor आप सभी की जरूरत है।

+0

नहीं, यह है नहीं। फिल्टर इटरेटर फ़िल्टर पर संकेतों के साथ अनुक्रम फ़िल्टर करता है - लेकिन मैं इटरेटर पर एक अनुमान बनाना चाहता हूं (यदि आप इसे फ़िल्टरिंग के रूप में सोचना चाहते हैं)। असल में, मैं अपने आंतरिक ऑपरेटर – ltjax

+0

पर '++' के रूप में '++' के रूप में प्रस्तुत करना चाहता हूं समस्या यह है कि लागू करने (कार्यान्वयन में) ऑपरेटर ++ दो बार कंटेनर को समाप्त कर सकता है, यह जांच किए बिना कि स्किपिंग तत्व पहले से ही अंत था या नहीं () इटरेटर। Althogh मुझे दिमाग में लूप के लिए एक है (skip_iterator it = v.begin(); it! = V.end(); ++ it) {} – alfC

+2

अल्फसी: आपको यह जांचना होगा कि क्या यह है! = End' यूनिलींग इटरेटर के 'ऑपरेटर ++' को दूसरी कॉल से पहले 'ऑपरेटर ++' के अंदर। – rubenvb

3
struct TrueOnEven { 
template< typename T > 
bool operator()(const T&) { return mCount++ % 2 == 0; } 
TrueOnEven() : mCount(0) {} 
private: 
    int mCount; 
}; 

int main() { 
std::vector<int> tVec, tOtherVec; 
... 
typedef boost::filter_iterator< TrueOnEven, int > TakeEvenFilterType; 

std::copy( 
    TakeEvenFilterType(tVec.begin(), tVec.end()), 
    TakeEvenFilterType(tVec.end(), tVec.end()), 
    std::back_inserter(tOtherVec)); 
} 

ईमानदार होने के लिए, यह अच्छा और सहज ज्ञान युक्त कुछ और है। मैं आलसी एकीकृत प्रश्नों ऊपर की तरह गोलमाल से बचने के लिए सहित एक साधारण "गणनाकार" पुस्तकालय लिखा .. यह आप लिखने के लिए अनुमति देता है:

Query::From(tVec.begin(), tVec.end()) 
.Skip<2>() 
.ToStlSequence(std::back_inserter(tOtherVec)); 

जहां Skip<2> मूल रूप से एक सामान्यीकृत "फ़िल्टर" जो हर एन वें छोड़ देता है को दर्शाता है (में इस मामले हर दूसरे) तत्व ...

चीयर्स,

पॉल

+0

+1 यह पहचानने के लिए कि यह सिर्फ एक मूर्ख हैक है। यह भी कई मान्यताओं को बनाता है कि कैसे आंतरिक एल्गोरिदम इटरेटर का उपयोग करता है और कैसे 'filter_iterator' predicate का उपयोग करता है।उदाहरण के लिए यदि किसी दिए गए इटरेटर के लिए 'ऑपरेटर() 'का मूल्यांकन दो बार किया जाता है, तो सब कुछ सिंक से बाहर हो जाता है। – ltjax

+0

खैर, कड़ाई से बोलना यह है कि, फ़िल्टर_इटरेटर 'std :: input_iterator' या' boost :: SinglePass' से किसी और चीज़ को वर्गीकृत करता है। आपको शायद एक पूर्ण 'skipping_iterator' लिखना चाहिए जो कठिन है तो ऐसा लगता है ... –

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