2012-11-16 21 views
5

मैं जानना चाहता हूं कि क्या वे वैक्टर में तत्वों तक पहुंचने के लिए एक सामान्य इटरेटर कर सकते हैं। मेरे पास विभिन्न वैक्टरों के लिए है लेकिन तत्वों को प्रदर्शित करने के लिए केवल एक ही कार्य है। यदि मेरे पास मेरी विधि से सामान्य जेनरेटर हो सकता है तो आसानी से काम कर सकता है। अगर यह संभव है तो कृपया सलाह दें।जेनेरिक इटरेटर वैक्टर तक पहुंचने के लिए

प्वाइंट 2, प्वाइंट 3, लाइन 2, लाइन 3 4 अलग-अलग वर्ग हैं। विधि एक वेक्टर ऑब्जेक्ट में ले जाती है जिसे मैंने किसी अन्य विधि में बनाया है।

template <typename VecObject> 
void Display(VecObject v) { 

    if (filterCriteria == "Point2") { 
     vector<Point2>::iterator it; 
    } else if (filterCriteria == "Point3") { 

    } else if (filterCriteria == "Line2") { 

    } else if (filterCriteria == "Line3") { 

    } 

    for (it = v.begin(); it!=v.end(); ++it) { 
     cout << *it << endl; 
    } 
} 

यह मैं ईलियर करने के लिए उपयोग करता था और यह काम करता था।

template <typename VecObject> 
void Display(const VecObject& v) { 
    typename VecObject::const_iterator it; 
    for (it = v.begin(); it!=v.end(); ++it) { 
     cout << *it << endl; 
    } 
} 

ध्यान दें कि मैं करने के लिए हस्ताक्षर बदल दिया है: मैं अब iterators

//for (int i = 0; i < v.size(); i++) { 
// cout << v[i]; 
// } 
+0

सी ++ का कौन सा संस्करण उपयोग करते हैं? –

+0

@DenisErmolin बेसिक मुझे लगता है .. लेकिन मुझे यकीन है कि मैं C++ 11 –

+0

@DenisErmolin का उपयोग नहीं कर रहा हूं, मैं C++ के लिए नया हूं इसलिए मुझे यकीन नहीं है कि –

उत्तर

5

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

वैकल्पिक रूप से, आप दो iterators लेने के लिए समारोह को लागू कर सकते हैं:

template <typename Iterator> 
void Display(Iterator first, Iterator last) { 
    for (Iterator it = first; it!=last; ++it) { 
     cout << *it << endl; 
    } 
} 

और इसे इस तरह कहते हैं:

Display(v.begin(), v.end()); 
+0

आपका कोड मुझे त्रुटियों का एक गुच्छा दे रहा है। यह कहता है 'वेक्टरऑब्जेक्ट' को –

+1

@ user1571494 क्षमा नहीं किया गया है, मेरे पास 'VecObject' के बजाय एक टाइपो,' वेक्टर ऑब्जेक्ट 'था। मैंने इसे अभी तय किया है। – juanchopanza

3
template<typename VectorObject> 
void Display(VecObject v) { 
    typename VectorObject::const_iterator it = v.begin(); 
    for (; it!=v.end(); ++it) { 
     cout << *it << endl; 
    } 
} 

मान लें कि आपके VectorObject लागू करता iterators आप यह करने के लिए उपयोग कर सकते हैं iterator सीधे टाइप करें।

उपयोग:

int main() 
{ 
    std::vector<int> intv(2, 5); 
    std::vector<float> fv(2, 10); 
    Display(intv); 
    Display(fv); 
    return 0; 
} 
संबंधित मुद्दे