2013-07-06 8 views
30

मैं निम्नलिखित कोड के लिए हस्ताक्षर किए चेतावनी मिलती है/अहस्ताक्षरित बेमेल:का उपयोग ऑटो ++

auto n = a.size(); 
for (auto i = 0; i < n; i++) { 
} 

समस्या यह है कि i करने के लिए 0 देकर इसकी int बजाय size_t हो जाता है।

size_t n = a.size(); 
for (size_t i = 0; i < n; i++) { 
} 

या इस: तो क्या बेहतर है

auto n = a.size(); 
for (size_t i = 0; i < n; i++) { 
} 

या हो सकता है आप एक बेहतर समाधान है? मुझे पहले एक और पसंद है क्योंकि यह थोड़ा अधिक संगत है, यह उसी उद्देश्य के लिए size_t और auto दोनों के बजाय size_t का उपयोग करता है।

for (const auto& i : a) 
{ 

} 

यहाँ, i कंटेनर a का एक तत्व के लिए एक const संदर्भ है:

+3

'ऑटो i = 0u' के बारे में कैसे? – jalf

+0

यदि आपको अपने लूप में इंडेक्स की आवश्यकता है तो int का उपयोग करने के बारे में कैसे? एक हस्ताक्षरित सूचकांक का उपयोग करना बहुत जल्दी हो सकता है। जैसे 'i' n - 1' गलत है जब' i' और 'n' हस्ताक्षरित हैं। –

उत्तर

38

एक श्रेणी के आधार पाश एक क्लीनर समाधान हो सकता है।

अन्यथा, अगर आपको इंडेक्स की आवश्यकता है, या यदि आप पूरी रेंज पर लूप नहीं करना चाहते हैं, तो आप decltype(a.size()) के साथ टाइप प्राप्त कर सकते हैं।

for (decltype(a.size()) i = 0; i < a.size(); ++i) { 
} 
+4

रेंज आधारित लूप के साथ 1 समस्या यह है कि इंडेक्स उपलब्ध नहीं है – RiaD

+0

हाँ, वास्तव में बड़ी समस्या है, मैं इंडेक्स को अलग से प्रबंधित नहीं करना चाहता हूं। – user2381422

+0

इसके लिए धन्यवाद। मुझे सी ++ 11 रेंज आधारित लूप पेश नहीं किया गया था। – stepanbujnak

18

क्या आप पाश और अपने संकलक की क्षमताओं के अंदर क्या करना चाहते हैं पर निर्भर करता है, सीमा के आधार पर पाश के लिए एक बेहतर समाधान हो सकता है।

मामूली मतभेद के साथ आपके सभी प्रस्तुत समाधान खराब नहीं हैं, आपका पहला समाधान वास्तव में खराब विकल्प है और यह वही है जो आपके कंपाइलर आपको बताता है। दूसरा समाधान के लिए बेहतर है, लेकिन यदि आप प्रत्यक्ष या सादगी के लिए प्रकार कुछ भविष्य को परिभाषित करने से बचना चाहते हैं, तो आपको निम्न कर सकते हैं:

auto n = a.size(); 
for (decltype(n) i = 0; i < n; i++) { 
} 

इस तरह आप i और n प्रकार बाँध हमेशा एक दूसरे के बराबर हो जाएं।

5

यदि आपने सही शाब्दिक उपयोग किया है, तो आप ठीक होंगे: 0 यू। ऑटो एक शाब्दिक प्रकार int int देखता है, तो मैं प्रकार का है। यू जोड़ें और इसके बजाय एक हस्ताक्षरित int अक्षर देखेंगे। अन्यथा, आप दूसरों के सुझाव के रूप में decltype का उपयोग करना चाहते हैं, विशेष रूप से आकार (आकार_टी) आकार (int) से अधिक हो सकता है (यह विंडोज़, ओएस एक्स, आदि पर है यदि 64-बिट लंबे मोड में चल रहा है)।

+2

मानक के अनुसार 'sizeof (0U) 'हमेशा' sizeof (size_t)' है? – Flexo

+0

@ फ्लेक्सो: इसे प्रतिबिंबित करने के लिए संपादित किया गया और किसी अन्य उत्तर की स्वीकृति को प्रोत्साहित किया गया। –

+0

-1। फ्लेक्सो कहते हैं कि इस जवाब का पहला भाग गलत है। और दूसरा आधा मूल रूप से कहता है "जैसा कि अन्य उत्तरों कहते हैं"। यदि आप "किसी अन्य उत्तर की स्वीकृति को प्रोत्साहित करना चाहते हैं", तो आप इसे हटा सकते हैं। – interjay

-2
for(auto n = a.size(), i = 0; i != n; ++i) { 
} 

आप सूचकांक, साथ ही वास्तविक तत्व का उपयोग करने की जरूरत है ... शायद साफ समाधान है।

अद्यतन: हालांकि यह अब और है कि साफ नहीं लगती है

for(auto n = a.size(), i = n*0; i != n; ++i) { 
} 

, रिचर्ड स्मिथ टिप्पणी के लिए एक वैकल्पिक हल होगा।

+4

यह सही नहीं है: एक 'ऑटो' घोषणा में जो एकाधिक चर घोषित करता है, प्रत्येक चर के लिए 'ऑटो' स्वतंत्र रूप से निकाला जाता है और कोड खराब हो जाते हैं यदि कट किए गए प्रकार समान नहीं होते हैं। –

2

चर्चा के लिए:

auto n = a.size(); 
for (auto i = n-n; i<n; ++i) { 
} 

ध्यान दें कि int की तुलना में छोटे प्रकार के लिए, घटाव परिणाम int (बुलाया पूर्णांक पदोन्नति) करने के लिए बढ़ जाती है।

1

स्थिरांक-सही जब भी संभव हो सकता है की कोशिश कर रहा, मैं आमतौर पर लिखें:

const auto n(a.size()); 
for (auto i = decltype(n){0}; i < n; ++i) 
{ 
} 

यह नहीं बहुत संक्षिप्त है, लेकिन यह स्पष्ट है कि आप एक चर (nn के प्रकार के 0 और करने के लिए प्रारंभ चाहते const है)।

0

यहाँ यह काम करने के लिए एक सरल & सफाई घोल है।

for(auto i: a) 
{ 
} 
संबंधित मुद्दे