का उपयोग कर एक वेक्टर में एक इंडेक्स प्राप्त करें जब वेक्टर के तत्वों पर पुनरावृत्ति करते हैं तो इसे इंडेक्स के बजाय इटरेटर्स का उपयोग करना पसंद किया जाता है (Why use iterators instead of array indices? देखें)।Iterators
std::vector<T> vec;
std::vector<T>::iterator it;
for (it = vec.begin(); it != vec.end(); ++it)
{
// do work
}
हालांकि, लूप के शरीर में इंडेक्स का उपयोग करना आवश्यक हो सकता है। प्रदर्शन और लचीलापन/विस्तारशीलता पर विचार करते हुए, निम्नलिखित में से कौन सा बेहतर होगा?
- रिवर्ट अनुक्रमित पाश को
std::vector vec; size_t i; for (i = 0; i < vec.size(); ++i) { // use i }
- गणना ऑफसेट
std::vector vec; std::vector::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { size_t i = it - vec.begin(); // use i }
- उपयोग std :: दूरी
std::vector vec; std::vector::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { size_t i = std::distance(vec.begin(), it); // use i }
प्रदर्शन का उल्लेख करना भूल गया, आम तौर पर यह मानना सुरक्षित है कि अनुक्रमित लूप का बेहतर प्रदर्शन होगा, लेकिन प्रदर्शन दोनों मामलों में बहुत समान होगा। – Guvante
मैं नहीं कह सकता कि मैं सहमत हूं। लूप के शरीर में अन्य कोड हो सकता है जो इटेटरेटर को कम करता है। इटरेटर आपके कोड को सरल बनाने के लिए नहीं हैं, वे आपके कोड को अधिक सामान्य बनाते हैं। इटरेटर का उपयोग करके आप वेक्टर को सूची के लिए स्वैप कर सकते हैं और यह अभी भी काम करेगा। – QBziZ
इसके अलावा, std :: map या std :: set iterators बेवकूफ से बहुत दूर हैं। अगर मैं सभी संभावित चाबियों पर लूप करता हूं, तो शायद यह हमेशा के लिए ले जाएगा। इसके अलावा, मुझे प्रत्येक कुंजी पर ओ (लॉग (एन)) लुकअप करना होगा। तो मेरा लूप ओ (एम * लॉग (एन) ले जाएगा)। एक इटरेटर का उपयोग करके मैं ओ (एन) समय में संग्रह पर लूप कर सकता था। –