अब इसे पढ़ने के लिए, सवाल सी ++ 11 के साथ एक महत्वपूर्ण बिंदु बन गया है।
मुझे यकीन नहीं था कि यह प्रतिक्रिया उत्तर के रूप में योग्य है या नहीं, क्योंकि यह वास्तव में प्रश्न के बिंदु को संबोधित नहीं करती है। लेकिन मुझे लगता है कि यह इंगित करने के लिए मान्य है कि यहां उठाई गई समस्या को कभी-कभी सी ++ 11 प्रोग्रामर के अभ्यास में सामना करना पड़ेगा, और मुझे निश्चित रूप से कुछ साल पहले यह प्रतिक्रिया उपयोगी लगेगी। इसलिए यह प्रतिक्रिया पाठक के लिए लक्षित है जो एसटीएल कंटेनर (vector
, list
, deque
, आदि) के सभी तत्वों के माध्यम से सर्वोत्तम को फिर से शुरू करने का तरीका जानना चाहता है।
Container container; // my STL container that has been filled with stuff
// (note that you can replace Container::value_type with the value in the container)
// the standard way
for (Container::value_type element : container) {
// access each element by 'element' rather than by '*it'
}
// or, if Container::value_type is large
Container container; // fill it with something
for (Container::value_type& element : container) {
//
}
// if you're lazy
Container container; // fill it with something
for (auto element : container) {
//
}
ओपी से कहा है कि:
यह मानते हुए कि ओपी कंटेनर में प्रत्येक तत्व के लिए उपयोग करना चाहता था, हम आसानी से है कि क्या परिभाषित करने end
पर्याप्त तेजी से होता है लेखन एक range-based for loop द्वारा Container::end()
बुला से की पूरी सवाल से बचने कर सकते हैं क्या प्रत्येक पुनरावृत्ति पर it
से Container::end()
की तुलना करने की ब्रेवटी के बीच व्यापार-बंद और परिवर्तनीय end
घोषित करने के प्रदर्शन और इसके बजाय प्रत्येक चरण में इसकी तुलना करना इसके लायक है। चूंकि लूप के लिए रेंज-आधारित एक सरल, आसान लिखना आसान है और आसानी से पढ़ने के लिए आसान है, आंतरिक रूप से, प्रत्येक चरण में Container::end()
विधि को कॉल करने के बजाय end
इटेटरेटर घोषित करता है, ऐसे मामलों की संख्या जहां हमें इस पर रहने की आवश्यकता है प्रश्न सीमित मामलों में सीमित कर दिया गया है।
{
auto && __range = range_expression ;
for (auto __begin = begin_expr,
__end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
के रूप में एक अलग रूप में: मैं भी 'के लिए (कंटेनर :: इटरेटर के लिए जाना चाहते हैं के रूप में प्रति cppreference.com
, सीमा आधारित पाश के लिए निम्नलिखित के रूप में एक ही साइड इफेक्ट के साथ कोड का उत्पादन करेगा यह = big.begin(), end = big.end(); it! = end; ++ it) {...} 'चर के लिए' अंत 'के लिए दायरे को सीमित करने के लिए केवल फॉर-लूप तक सीमित करें। – haffax
सी # और जावा देव इस तरह के लूप लिखते हैं ताकि जेआईटीआर इसे अनुकूलित कर सके (प्रति पुनरावृत्ति प्रति एक चेक)। ऐसा लगता है कि सी ++ के मामले में नहीं है। –
सी ++ देव सिर्फ 'for_each (शुरू करें (सी), अंत (सी), []() {});' लूप्स लाइब्रेरी लेखकों के लिए हैं: पी – MSalters