2012-01-09 9 views
26

सी ++ 11 में एक कंटेनर को फिर से शुरू करने का अनुशंसित तरीका क्या है?सी ++ 11 में एक कंटेनर को फिर से शुरू करने का अनुशंसित तरीका क्या है?

container.begin() and container.end() 

या

begin(container) and end(container) 

किसी भी तो का उपयोग करना, जब एक दूसरे के ऊपर प्राथमिकता दी जाती है?

+4

आपके उदाहरणों के प्रति पुनरावृत्ति के साथ कुछ लेना देना नहीं है। यह इस श्रेणी के बारे में है कि कंटेनर का एक वर्ग है जो कक्षा के किसी ऑब्जेक्ट से है। – pmr

+5

अनुशंसित तरीकों के लिए अभी तक पर्याप्त अनुभव नहीं है। सिंटैक्स और स्टार्ट/एंड फ्री फ़ंक्शंस के लिए नया फायदे हैं, लेकिन इसमें कमी का अनुभव हो सकता है (मुझे उम्मीद है कि कोई भी नहीं, लेकिन मुझे अनुभव की अधिकांश शिक्षाओं की उम्मीद नहीं थी, भले ही मुझे कुछ उम्मीद थी)। – AProgrammer

उत्तर

24

बेहतर तरीका है क्योंकि यह अधिक विस्तृत है

begin(container) 
end(container) 

है। उदाहरण के लिए, टेम्पलेट तर्क कटौती का उपयोग एक स्थिर सरणी के आकार को निर्धारित करने के लिए किया जा सकता है और इसलिए begin(my_static_array) और end(my_static_array) काम करेगा।

अधिक आम तौर पर, आप (।) अंत (।) शुरू करने के लिए अधिभार/विशेषज्ञता जोड़ सकते हैं और जेनेरिक एल्गोरिदम में अपरिवर्तनीय विरासत प्रकारों का उपयोग कर सकते हैं।

आप वास्तव में केवल आप एक सामान्य एल्गोरिथ्म अपने आप

template <typename T> 
void foo (T & t) 
{ 
    bar (begin(t), end(t)); // certainly better than bar(t.begin(), t.end()) 
} 

ग्राहक कोड में यह बात इतना नहीं लिख रहे हैं, तो इस बारे में चिंता करने की जरूरत। वास्तव में, मैं कहूंगा कि उस मामले में नए रूप का उपयोग न करें - मुझे कुछ परिस्थितियों के लिए कुछ शैलियों/मुहावरे आरक्षित करना पसंद है, मेरे दिमाग को विभाजित करें। लेकिन यह सिर्फ मुझे है।

for (auto i = c.begin(); i != c.end(); ++i) 
    // I can see at-a-glance that c is a STL-style container. 
    // That might be useful to know. I can probably dismiss static arrays 
    // and unorthodox containers as possibilities. 
    foo (i, c.size()); 
+0

यहां एक इटरेटर का संदर्भ क्यों लें? – Useless

+0

क्योंकि मैं 'ऑटो (i और c: c)' के साथ scrambled मिला, अब हटा दिया। धन्यवाद। – spraff

+4

यदि आप किसी सरणी पर पुनरावृत्ति सक्षम करना चाहते हैं, तो आपको या तो 'std :: start (t)' और 'std :: end (t) 'लिखना होगा, या आपको' std :: start; का उपयोग करके 'लिखना होगा। 'std :: end का उपयोग करना;' फ़ंक्शन के अंदर पहले दो कथन के रूप में (जैसे std :: swap' idiom का उपयोग करना)। – fredoverflow

37

मुझे लगता है कि range based for loops

for (auto item : container) 

के साथ नए वाक्य रचना शायद सबसे सी ++ 11 की तरह है।

जैसा कि अन्य ने टिप्पणी की, आप कभी-कभी या const auto&auto के बजाय चाहते हैं।

+0

@ बेसिल: मैं सहमत हूं, लेकिन वीएस 10 अभी तक इसका समर्थन नहीं करता है इसलिए मैंने अभी तक इसके साथ नहीं खेला है। :) –

+0

@spraff: सहमत है, लेकिन सवाल (जानबूझकर?) अस्पष्ट था, और मेरा जवाब फिट बैठता है! –

+11

अनावश्यक प्रतियों से बचने के लिए, मैं वस्तुओं को एक संदर्भ के रूप में ले जाऊंगा: 'ऑटो और आइटम: कंटेनर'। – Xeo

संबंधित मुद्दे

 संबंधित मुद्दे