C++
क्लासिक C ++ उदाहरणों की साइड तुलना C ++ बनाम C ++ 11 बनाम C ++ 14 बनाम C ++ 17 के माध्यम से हल की गई है
खोज…
एक कंटेनर के माध्यम से लूपिंग
C ++ में, अनुक्रम कंटेनर c माध्यम से लूपिंग निम्नानुसार अनुक्रमित का उपयोग करके किया जा सकता है:
for(size_t i = 0; i < c.size(); ++i) c[i] = 0;
जबकि सरल, ऐसे लेखन सामान्य शब्दार्थ त्रुटियों के अधीन होते हैं, जैसे गलत तुलना ऑपरेटर, या गलत अनुक्रमण चर।
for(size_t i = 0; i <= c.size(); ++j) c[i] = 0;
^~~~~~~~~~~~~~^
समान कमियों के साथ, सभी कंटेनर का उपयोग करके लूपिंग प्राप्त की जा सकती है:
for(iterator it = c.begin(); it != c.end(); ++it) (*it) = 0;
C ++ 11 ने लूप और auto कीवर्ड के लिए रेंज-आधारित की शुरुआत की, जिससे कोड बन सके:
for(auto& x : c) x = 0;
यहाँ केवल पैरामीटर हैं c और वर्तमान मान को रखने के लिए एक चर x । यह पहले बताए गए शब्दार्थ त्रुटियों को रोकता है।
C ++ 11 मानक के अनुसार, अंतर्निहित कार्यान्वयन इसके बराबर है:
for(auto begin = c.begin(), end = c.end(); begin != end; ++begin)
{
// ...
}
इस तरह के कार्यान्वयन में, अभिव्यक्ति auto begin = c.begin(), end = c.end(); बलों की begin और end एक ही प्रकार के होते हैं, जबकि end कभी भी वृद्धि नहीं होती है, और न ही संदर्भित होती है। तो लूप के लिए रेंज-आधारित केवल एक जोड़ी इट्रेटर / इट्रेटर द्वारा परिभाषित कंटेनरों के लिए काम करता है। C ++ 17 मानक कार्यान्वयन को बदलकर इस बाधा को शांत करता है:
auto begin = c.begin();
auto end = c.end();
for(; begin != end; ++begin)
{
// ...
}
यहां begin और end को अलग-अलग प्रकार के होने की अनुमति है, जब तक कि असमानता के लिए उनकी तुलना की जा सकती है। यह अधिक कंटेनरों के माध्यम से लूप की अनुमति देता है, उदाहरण के लिए एक जोड़ी itter / संतरी द्वारा परिभाषित कंटेनर।