सादे सरणियों के लिए काम के लिए रेंज-आधारित कैसे होता है?
यह है कि के रूप में पढ़ने के लिए, " मुझे बताओ कि क्या एक के लिए (सरणियों के साथ) करता है? "
मैं यह मानकर उत्तर दूंगा कि - नेस्टेड सरणियों का उपयोग करके निम्नलिखित उदाहरण लें:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
पाठ संस्करण:
ia
सरणियों की एक सरणी है ("नेस्टेड ऐरे"), जिसमें [3]
एरे होते हैं, जिसमें प्रत्येक [4]
मान होते हैं। उपरोक्त उदाहरण ia
प्राथमिक 'रेंज' ( [3]
) के माध्यम से लूप करता है , और इसलिए [3]
कई बार लूप करता है। प्रत्येक पाश में से एक का उत्पादन ia
की [3]
युक्त एक सरणी - प्राथमिक मूल्यों पहले से शुरू है और पिछले के साथ समाप्त [4]
मान।
- पहला लूप:
pl
बराबर {1,2,3,4}
- एक सरणी
- दूसरा लूप:
pl
बराबर {5,6,7,8}
- एक सरणी
- तीसरा लूप:
pl
बराबर {9,10,11,12}
- एक सरणी
इससे पहले कि हम इस प्रक्रिया की व्याख्या करें, यहाँ सरणियों के बारे में कुछ दोस्ताना अनुस्मारक दिए गए हैं:
- Arrays को उनके पहले मूल्य के संकेत के रूप में व्याख्यायित किया जाता है - किसी भी पुनरावृत्ति के बिना किसी सरणी का उपयोग करके पहले मान का पता दिया जाता है
pl
एक संदर्भ होना चाहिए क्योंकि हम सरणियों की प्रतिलिपि नहीं बना सकते हैं
- सरणियों के साथ, जब आप सरणी ऑब्जेक्ट में खुद को एक संख्या जोड़ते हैं, तो यह आगे बढ़ता है कि कई बार और बराबर प्रविष्टि के लिए 'अंक' - यदि
n
प्रश्न में संख्या है, तो ia[n]
उसी के रूप में है*(ia+n)
(हम n
प्रविष्टियों को दर्ज करने वाले पते को डीरफेर कर रहे हैं) आगे), और ia+n
जैसा है &ia[n]
(हम सरणी में उस प्रविष्टि का पता प्राप्त कर रहे हैं) के समान है।
यहाँ क्या हो रहा है:
- प्रत्येक लूप पर , के साथ
pl
एक संदर्भ के रूप में सेट किया गया हैia[n]
n
वर्तमान लूप काउंट 0. तो से शुरू की बराबरी, pl
है ia[0]
दूसरा यह है पर, पहले दौर पर ia[1]
, और इतने पर। यह पुनरावृत्ति के माध्यम से मान निकालता है।
- पाश इतने लंबे समय तक चला जाता है
ia+n
कम है end(ia)
।
... और वह इसके बारे में है।
यह वास्तव में यह लिखने का एक सरल तरीका है :
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int n = 0; n != 3; ++n)
auto &pl = ia[n];
यदि आपकी सरणी नेस्टेड नहीं है, तो यह प्रक्रिया थोड़ी सरल हो जाती है कि संदर्भ की आवश्यकता नहीं है, क्योंकि पुनरावृत्त मूल्य एक सरणी नहीं है, बल्कि एक 'सामान्य' मान है:
int ib[3] = {1,2,3};
for (auto pl : ib)
cout << pl;
for (int n = 0; n != 3; ++n)
cout << ib[n];
कुछ अतिरिक्त जानकारी
क्या होगा अगर हम auto
बनाते समय कीवर्ड का उपयोग नहीं करना चाहते हैंpl
? वो कैसा लगता है?
निम्नलिखित उदाहरण में, pl
एक को संदर्भित करता है array of four integers
। प्रत्येक लूप पर pl
मूल्य दिया जाता है ia[n]
:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
और ... कि यह कैसे काम करता है, अतिरिक्त जानकारी के साथ किसी भी भ्रम को दूर करने के लिए। यह केवल एक 'शॉर्टहैंड' for
लूप है जो स्वचालित रूप से आपके लिए मायने रखता है, लेकिन मैन्युअल रूप से इसे किए बिना वर्तमान लूप को पुनर्प्राप्त करने का एक तरीका नहीं है।
for
। लेकिन जिस क्षण सरणी सूचक को इंगित करता है, आकार की जानकारी खो जाती है।