संक्षिप्त जवाब:
लगभग नहीं
लंबा जवाब:
जब भी आपके पास चार से बड़ा वेक्टर होना चाहिए, जो कि 32 बिट सिस्टम पर 2 जीबी है। हर दूसरे उपयोग के मामले में, हस्ताक्षरित प्रकार का उपयोग करना एक अहस्ताक्षरित प्रकार का उपयोग करने की तुलना में अधिक सुरक्षित है।
उदाहरण:
std::vector<A> data;
[...]
// calculate the index that should be used;
size_t i = calc_index(param1, param2);
// doing calculations close to the underflow of an integer is already dangerous
// do some bounds checking
if( i - 1 < 0 ) {
// always false, because 0-1 on unsigned creates an underflow
return LEFT_BORDER;
} else if( i >= data.size() - 1 ) {
// if i already had an underflow, this becomes true
return RIGHT_BORDER;
}
// now you have a bug that is very hard to track, because you never
// get an exception or anything anymore, to detect that you actually
// return the false border case.
return calc_something(data[i-1], data[i], data[i+1]);
के बराबर हस्ताक्षरित size_t
है ptrdiff_t
, नहीं int
। लेकिन int
size_t की तुलना में अधिकांश मामलों में उपयोग करना अभी भी बेहतर है। ptrdiff_t
है long
32 और 64 बिट सिस्टम पर।
इसका मतलब है कि जब भी आप एक std :: कंटेनरों के साथ बातचीत करते हैं, तो आपको हमेशा size_t में कनवर्ट करना पड़ता है, जो कि बहुत सुंदर नहीं है। लेकिन जा रहे मूल सम्मेलन में c ++ के लेखकों ने उल्लेख किया कि डिजाइनिंग std :: वेक्टर एक अहस्ताक्षरित size_t के साथ एक गलती थी।
यदि आपका संकलक आपको ptrdiff_t से size_t तक निहित रूपांतरण पर चेतावनी देता है, तो आप इसे रचनाकार वाक्य रचना के साथ स्पष्ट कर सकते हैं:
calc_something(data[size_t(i-1)], data[size_t(i)], data[size_t(i+1)]);
अगर बस एक संग्रह को पुनरावृत्त करना चाहते हैं, बिना चिंग के बिना, के लिए सीमा का उपयोग करें:
for(const auto& d : data) {
[...]
}
देशी जाने पर बज़्ने स्ट्रॉस्ट्रुप (C ++ लेखक) के कुछ शब्द
कुछ लोगों के लिए एसटीएल में इस हस्ताक्षरित / अहस्ताक्षरित डिज़ाइन त्रुटि पर्याप्त कारण है, एसटीडी :: वेक्टर का उपयोग न करने के लिए, बल्कि इसके स्वयं के कार्यान्वयन के लिए।
size_t
करना चाहिए ।