आमतौर पर, पुनरावृत्तियों का उपयोग रैखिक फैशन में एक कंटेनर के तत्वों तक पहुंचने के लिए किया जाता है; हालांकि, "यादृच्छिक अभिगम पुनरावृत्तियों" के साथ, किसी भी तत्व को उसी तरीके से एक्सेस करना संभव है जैसा कि operator[]
।
एक वेक्टर में मनमाने तत्वों तक पहुँचने के लिए vec
, आप निम्नलिखित का उपयोग कर सकते हैं:
vec.begin() // 1st
vec.begin()+1 // 2nd
// ...
vec.begin()+(i-1) // ith
// ...
vec.begin()+(vec.size()-1) // last
निम्नलिखित एक विशिष्ट एक्सेस पैटर्न का एक उदाहरण है (C ++ के पुराने संस्करण):
int sum = 0;
using Iter = std::vector<int>::const_iterator;
for (Iter it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
पुनरावृत्त का उपयोग करने का लाभ यह है कि आप अन्य कंटेनरों के साथ एक ही पैटर्न लागू कर सकते हैं :
sum = 0;
for (Iter it = lst.begin(); it!=lst.end(); ++it) {
sum += *it;
}
इस कारण से, टेम्पलेट कोड बनाना वास्तव में आसान है जो कंटेनर प्रकार की परवाह किए बिना समान काम करेगा । पुनरावृत्तियों का एक और लाभ यह है कि यह डेटा को स्मृति में निवासी नहीं मानता है; उदाहरण के लिए, कोई एक आगे का इटरेटर बना सकता है जो इनपुट स्ट्रीम से डेटा पढ़ सकता है, या जो केवल फ्लाई पर डेटा उत्पन्न करता है (जैसे एक श्रेणी या यादृच्छिक संख्या जनरेटर)।
एक और विकल्प का उपयोग कर std::for_each
और लैम्ब्डा:
sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });
C ++ 11 के बाद से आप auto
इट्रेटर के बहुत लंबे, जटिल प्रकार के नाम को निर्दिष्ट करने से बचने के लिए उपयोग कर सकते हैं जैसा कि पहले देखा गया है (या इससे भी अधिक जटिल):
sum = 0;
for (auto it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
और, इसके अलावा, प्रत्येक संस्करण के लिए एक सरल है:
sum = 0;
for (auto value : vec) {
sum += value;
}
और अंत में वहाँ भी है std::accumulate
जहाँ आपको सावधान रहना होगा कि क्या आप पूर्णांक या फ्लोटिंग पॉइंट नंबर जोड़ रहे हैं।