2012-03-27 14 views
8

auto का पालन कर उपयोग को देखते हुए:सी ++ 11 ऑटो और size_type

std::vector<int> v; 
for (auto i = 0; i < v.size(); ++i) { 
    ... 
} 

यह सी ++ std::vector<int>::size_type रूप i निकालना के लिए आदर्श होगा, लेकिन अगर यह केवल i के लिए प्रारंभकर्ता पर लग रहा है, यह देखना होगा पूर्णांक। इस मामले में i का अनुमानित प्रकार क्या है? क्या यह auto का उचित उपयोग है?

+0

बिना पता है कि आप के साथ क्या 'मैं' घ यह बताने के लिए असंभव है। –

+0

मुझे कभी नहीं पता था कि 'ऑटो' का उपयोग एक चर के उचित प्रकार को कम करने के लिए किया जाता है! क्या यह? –

+3

@ श्री टैमर हाँ, उन्होंने सी ++ 11 में इसका अर्थ बदल दिया। –

उत्तर

20

auto के बजाय i घोषित करने के लिए decltype का उपयोग करें।

for(decltype(v.size()) i = 0; i < v.size(); ++i) { 
    // ... 
} 

और भी बेहतर, @ MarkB के जवाब से पता चलता है के रूप में वेक्टर से अधिक तेज़ी से दोहराने में iterators का उपयोग करें।

+3

या इससे भी बेहतर, लूप के लिए श्रेणी-आधारित का उपयोग करें, जैसा कि नीचे दिए गए उत्तर में है। – juanchopanza

13

क्यों iterators के साथ अपनी समस्या को हल नहीं कर रहा? तो समस्या दूर हो जाने:

std::vector<int> v; 
for (auto i = v.begin(); i != v.end(); ++i) { 
    ... 
} 

आप अनुक्रमणिका का उपयोग कर मैं शायद सिर्फ़ स्पष्ट प्रकार उल्लेख होगा पुनरावृति करना चाहते हैं: तुम्हें पता है कि यह क्या है। auto मुख्य रूप से अज्ञात या हार्ड-टू-टाइप टेम्पलेट प्रकारों के लिए उपयोग किया जाता है जो मुझे विश्वास है।

+1

इसे शुरू करना चाहिए (v) और अंत (v) – Klaim

3

auto प्रारंभकर्ता से विशेष रूप से टाइप हो जाता है। चर के प्रकार को निर्धारित करने के लिए कम से कम नहीं, अन्य उपयोगों पर कोई ध्यान नहीं दिया जाता है। साथ ही खाते में है कि लेने के लिए, decltype एक विकल्प है:

for (decltype(v.size()) i = 0; i < v.size(); ++i) 

या, आप पाश के पुनर्लेखन के लिए पीछे की ओर जाने के लिए सक्षम हो सकता है:

for (auto i = v.size(); i-- != 0;) 

या, आप से बचने के लिए सक्षम हो सकता है पूरी तरह से for पाश।

7

अपने प्रश्न का उत्तर "ऑटो के इस उचित उपयोग है?" अन्य उत्तरों में बताए गए कारणों के लिए कोई नहीं है। एक कंटेनर की सामग्री के माध्यम से पाशन के विशेष मामले के लिए, आप सबसे अधिक संभावना के लिए लूप आधारित एक सीमा के साथ बेहतर कर रहे हैं: तत्वों को

स्थिरांक संदर्भ का उपयोग, iconst int& है:

std::vector<int> v; 
for (const auto& i : v) { 
    std::cout << i << "\n"; 
} 

गैर स्थिरांक संदर्भ का उपयोग, iint& है:

std::vector<int> v; 
for (auto& i : v) { 
    ++i; 
    std::cout << i << "\n"; 
} 

मूल्य का उपयोग, iint है:

0,123,
std::vector<int> v; 
for (auto i : v) { 
    ... 
} 

और इतने पर। यह सी-स्टाइल सरणी के लिए भी काम करता है।