2009-06-03 13 views
20

मैं एक परिपत्र सूची का उपयोग करना चाहता हूँ।क्या सी ++ के लिए परिपत्र सूची का मानक कार्यान्वयन मौजूद है?

अपना खुद का कार्यान्वयन करने का छोटा (like this person did) मेरे विकल्प क्या हैं?

विशेष रूप से मैं जो करना चाहता हूं वह वस्तुओं की एक सूची पर पुनरावृत्त है। जब मेरा पुनरावर्तक सूची के अंत तक पहुंच जाता है, तो इसे स्वचालित रूप से शुरुआत में वापस जाना चाहिए। (हाँ, मुझे एहसास है कि यह खतरनाक हो सकता है।)

See Vladimir's definition of a circular_iterator: "एक परिपत्र_इटरेटर सर्कुलरलिस्ट :: एंड() के साथ कभी बराबर नहीं होगा, इस प्रकार आप हमेशा इस इटरेटर को कम कर सकते हैं।"

उत्तर

27

कोई मानक परिपत्र सूची नहीं है।

हालांकि, बूस्ट में circular buffer है, जो सहायक हो सकता है।

यदि आपको किसी भी फैंसी की आवश्यकता नहीं है, तो आप केवल vector का उपयोग कर सकते हैं और इंडेक्स के साथ तत्वों तक पहुंच सकते हैं। सर्कुलर सूची के समान ही चीज़ प्राप्त करने के लिए आप वेक्टर के आकार के साथ बस mod कर सकते हैं।

+3

धन्यवाद नाफ! वेक्टर के आकार के साथ इंडेक्स को संशोधित करना इतना आसान समाधान है, मैं शर्मिंदा हूं, मैंने इसके बारे में नहीं सोचा था। – Runcible

+0

यदि आप सुनिश्चित करते हैं कि आपके 'वेक्टर' का आकार दो की शक्ति है, तो मॉड्यूलस ऑपरेशन के महंगे ओवरहेड की बजाय, बिटवाई '&' ऑपरेटर का उपयोग करें, क्योंकि यह केवल एक चक्र खर्च करता है। यह इस प्रकार काम करता है: '(एन मोड (2^के)) == (एन और (2^के -1)) 'उदा। 'एन% 256 == (एन और (255))' –

16

आप कुछ पुनरावर्तक आप अपने खुद के रोल कर सकते हैं, जैसे

template <class baseIter> 
class circularIterator { 
    private: 
     baseIter cur; 
     baseIter begin; 
     baseIter end; 
    public: 
     circularIterator(baseIter b, baseIter e, baseIter c=b) 
      :cur(i), begin(b), end(e) {} 
     baseIter & operator ++(void) {++cur; if(cur == end) {cur = begin;}} 
}; 

(अन्य इटरेटर संचालन पाठक के लिए व्यायाम के रूप में छोड़ दिया) कुछ देख की तरह लग रही हैं।

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