2016-08-09 9 views
5

मुझे अपने कस्टम यादृच्छिक अभिगम संग्रह वर्ग के लिए एक पुनरावर्तक की आवश्यकता है। मैं इटरेटर का उपयोग std::sort के साथ करना चाहता हूं। चूंकि मैं एक सीमित समय बजट के साथ सी ++ न्यूबी हूं, मैं खुद को पूरी चीज लिखने से बचना चाहता हूं।बूस्ट की गिनती_इटरेटर क्यों है?

मेरा इटरेटर मूल रूप से बस एक साधारण size_t है। इसलिए, मैंने सोचा कि boost::counting_iterator एक अच्छा मैच हो सकता है। एक बार जब मैंने Incrementable पूरा कर लिया था तो मुझे एहसास हुआ कि counting_iterator इसके संदर्भ प्रकार को const Incrementable& के रूप में परिभाषित करता है।

हालांकि मैं अभी भी बहुत सी ++ से उलझन में हूं, मुझे विश्वास है कि यह मुझे std::sort के साथ इटरेटर का उपयोग करने से रोक देगा क्योंकि कस्ट इटेटर का उपयोग संग्रह तत्वों को स्वैप करने के लिए नहीं किया जा सकता है।

यहां प्रश्न है: boost::counting_iteratorconst के रूप में इसके संदर्भ प्रकार को परिभाषित क्यों करता है और शायद अधिक महत्वपूर्ण है, इसके बजाय मुझे इसका क्या उपयोग करना चाहिए?

+1

'boost :: counting_iterator' कंटेनर तक पहुंचने के लिए उपयोग योग्य नहीं है। यह प्राकृतिक संख्या '0, 1, 2, ... के अनुक्रम" पहुंचने "के लिए बनाया गया है। यही कारण है कि इसका संदर्भ प्रकार 'const' है: आप' 2' बनने के लिए '2' हैक नहीं कर सकते हैं। –

+0

"मुझे अपने कस्टम यादृच्छिक अभिगम संग्रह वर्ग के लिए एक पुनरावर्तक की आवश्यकता है।" शायद "मैं एक नौसिखिया हूँ" के साथ संगत नहीं है। क्या मैं पूछ सकता हूं कि आपको कस्टम संग्रह कक्षा क्यों चाहिए? –

+0

"मेरा इटेटरेटर मूल रूप से बस एक साधारण 'size_t' है" मुझे समझ में नहीं आता है।'size_t' इटेटरेटर अवधारणा – KABoissonneault

उत्तर

1

बूस्ट :: counting_iterator इसके संदर्भ प्रकार को कॉन्स्ट के रूप में परिभाषित क्यों करता है?

इसका उद्देश्य, as described here, एक ऑब्जेक्ट के साथ सरणी भरना है जो इटेटरेटर बढ़ने पर स्वयं बढ़ता है। अपने दस्तावेज़ों के माध्यम से एक संक्षिप्त रूप से देखने के बाद (मैं कोई बूस्ट विशेषज्ञ बीटीडब्ल्यू नहीं हूं) ऐसा लगता है कि आपकी बढ़ती वस्तु के की प्रतिलिपि है। इसके बाद किसी व्यक्ति को अपनी आंतरिक प्रतिलिपि को संशोधित करने के लिए, इसकी आंतरिक प्रतिलिपि में कॉन्स संदर्भ देता है।

एक बार मैं Incrementable पूरा किया था मैं एहसास है कि counting_iterator स्थिरांक Incrementable & के रूप में अपनी संदर्भ प्रकार परिभाषित करता था।

हां, जब इसे संदर्भित किया जाता है तो यह बढ़ती हुई वस्तु के निरंतर संदर्भ को वापस कर देगा, जो स्वयं ही स्थिर है (इसलिए इसे बढ़ाया जा सकता है और घटित किया जा सकता है)।

मेरा मानना ​​है कि यह मुझे std :: sort के साथ इटरेटर का उपयोग करने से रोक देगा क्योंकि const Iterators का उपयोग संग्रह तत्वों को स्वैप करने के लिए नहीं किया जा सकता है।

सही :) अंडर-हुड एक स्वैप की तरह

using T = size_t; 
T tmp = a; 
a = b; // requires a to be non-constant 
b = tmp; // requires b to be non-constant 

लग रहा है मैं बजाय क्या इस्तेमाल करना चाहिए?

आपके कंटेनर पर निर्भर करता है। कंटेनर में एक इटरेटर को कंटेनर में किसी तत्व के लिए पॉइंटर होना चाहिए। आप शायद एक मानक पुनरावर्तक का उद्देश्य कर सकते हैं।

+0

आप सही हैं, 'counting_iterator' का स्पष्ट रूप से एक अलग उद्देश्य है। दुर्भाग्य से, मेरा संग्रह एक संग्रह सूचक को एक साधारण सूचक की अनुमति नहीं देता है। मेरा संग्रह एक एसक्यूएल रिलेशनशिप जैसा दिखता है और यह कॉलम द्वारा अपने तत्वों को स्टोर करता है। दूसरी तरफ इटेटरेटर, पंक्ति से मॉडल तक पहुंचने और इटरेटर को लिखने के लिए किसी प्रकार की अनुवाद प्रक्रिया से गुज़रना पड़ता है। इसलिए सरल पॉइंटर्स एक विकल्प नहीं हैं। –

+0

आप किस मानक इटरेटर के बारे में सोच रहे हैं? मैं केवल इटरेटर ढूंढ सकता हूं जो विशिष्ट संग्रह प्रकारों से बंधे हैं। –

+0

मैं एक एसक्यूएल विशेषज्ञ नहीं हूं, लेकिन यदि आप 'std :: vector' के 'std :: tuple' का उपयोग कर रहे हैं तो मुझे नहीं लगता कि एक इटरेटर के साथ टुपल में फिर से चलना संभव है ([यहां देखें आप इसे कैसे कर सकते हैं इसके लिए] (http://stackoverflow.com/a/6894436/6367128))। क्या सभी वैक्टरों में समान अंतर्निहित प्रकार होता है? यदि ऐसा है, तो आप ट्यूपल से बच सकते हैं और वैक्टर के वेक्टर का उपयोग कर सकते हैं। – Judge

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