यह अच्छी तरह से अहस्ताक्षरित पूर्णांकों का उपयोग करने के लिए निर्धारित किया है इस तरह से (और size_t
अहस्ताक्षरित है), wraparound साथ: उस व्यवहार, के रूप में हस्ताक्षर किए पूर्णांकों के साथ करने का विरोध किया, मानक द्वारा गारंटीकृत है जहां यह है मानक द्वारा गारंटी नहीं है।
हालांकि यह बेकार में चतुर है। अहस्ताक्षरित के लिए निहित रैपिंग प्रोन्नति के कारण
एक सामान्य नियम के रूप में, से बचने के लिए समस्या है, थोड़ा-स्तरीय सामान के लिए अहस्ताक्षरित पूर्णांकों का उपयोग, उपयोग संख्या के लिए पूर्णांकों पर हस्ताक्षर किए। जहां आपको size_t
से संबंधित एक हस्ताक्षरित पूर्णांक की आवश्यकता है, वहां आपके लिए ptrdiff_t
है। हस्ताक्षरित परिणाम के साथ n_items
फ़ंक्शन को परिभाषित करें, उदा।
using Size = ptrdiff_t;
template< class Container >
auto n_items(Container const& c)
-> Size
{ return end(c) - begin(c); }
और आप संकलक से जाने के लिए, कोई और अधिक sillywarnings तैयार हैं।
बहुत चालाक दिया कोड की बजाय
vector<int> v { 1,2,3,4,5 };
bool rev = true;
size_t start, end, di;
if (rev) {
start = v.size()-1;
end = -1;
di = -1;
}
else {
start = 0;
end = v.size();
di = 1;
}
for (auto i=start; i!=end; i+=di) {
cout << v[i] << endl;
उदा करना
const vector<int> v { 1,2,3,4,5 };
const bool reverse = true; // whatever
for(int i = 0; i < n_items(v); ++i)
{
const int j = (reverse? n_items(v) - i - 1 : i);
cout << v[j] << endl;
}
स्रोत
2015-01-31 03:15:45
मानक के रूप में' स्थिर स्थिरांक size_type एनपीओ = -1 'परिभाषित करता है std :: स्ट्रिंग :: npos'। Pedantic होने के लिए आप पसंद कर सकते हैं: 'std :: वेक्टर :: size_type प्रारंभ, अंत, di;'। –
Galik
@Galic: मैं यह देखने के लिए कि क्या पांडित्य (के रूप में आप यह कहते हैं) को प्राप्त होता है असफल, क्या लाभ यह एक मेंटेनर has.If 'एक संभाजक प्रावधान है कि साथ instantiating std :: vector' से बातें तोड़ने के लिए अपने या अपने रास्ते से बाहर चला जाता है एक मूर्ख आकार का प्रकार, जो पैडेंट्री करता है वह उस चीज को बढ़ाता है जिससे वह चीजों को झुकाव में सफल होता है। जैसा की मैं देख पा रहा हूँ। –
@ चीयर्संधथ.-अल्फ ठीक है आप शायद सही हैं। जहां तक मैं कह सकता हूं कि मानक कहता है कि 'std :: vector :: size_type' को हस्ताक्षरित किया जाना चाहिए, लेकिन मुझे लगता है कि यह' std :: size_t' के लिए एक अलग आकार हो सकता है। हालांकि मुझे लगता है कि अधिकांश कार्यान्वयन 'size_type' को 'size_t' जैसा ही बना देंगे। –
Galik