2012-06-23 9 views
29

यदि मैं वेक्टर में एक मूल्य प्राप्त करना चाहता हूं तो मैं दो विकल्पों का उपयोग कर सकता हूं: [] ऑपरेटर का उपयोग करें। या मैं प्रयोग करने के लिए उदाहरण .at फ़ंक्शन का उपयोग हो सकता है:सी ++ में "वेक्टर [x]" से बेहतर "vector.at (x)" का उपयोग क्यों कर रहा है?

vector<int> ivec; 
ivec.push_back(1); 

अब मैं दोनों बातें

int x1 = ivec[0]; 
int x2 = ivec.at(0); // or 

मैं कम से एक बेहतर विकल्प है क्योंकि जब मुझे लगता है कि विकल्प का उपयोग मैं इस फेंक कर सकते हैं का उपयोग कर के बारे में सुना कर सकते हैं एक अपवाद में एक।

क्या कोई इसे समझा सकता है?

+3

"क्या अंतर है?" एक अच्छा सवाल है। जवाब है: 1) स्वत: रेंज जांच (.at() एक ऑफ-ऑफ-रेंज अपवाद फेंक देगा, [] चुपचाप विफल हो जाएगा), और 2) व्यक्तिगत वरीयता - आपको कौन सा सिंटैक्स बेहतर पसंद है। "कौन सा बेहतर है?", दूसरी ओर एक मूल्य निर्णय है। जवाब जरूरी है "यह निर्भर करता है"। IMHO ... – paulsm4

+11

कोई भी बेहतर नहीं है, वे _similar लेकिन different_ उद्देश्यों की सेवा करते हैं। –

उत्तर

54

c[i] और c.at(i) के बीच अंतर यह है कि at()std::out_of_range अपवाद फेंकता है तो i, वेक्टर की श्रेणी से बाहर जाता है, जबकि operator[] बस अपरिभाषित व्यवहार का आह्वान, जिसका अर्थ है कुछ भी हो सकता है।

कोई भी नहीं कहता है at()operator[] से बेहतर है। यह सिर्फ परिस्थितियों पर निर्भर करता है। at() रेंज चेक करता है, यह हमेशा वांछनीय नहीं हो सकता है, खासकर जब आपका कोड स्वयं सुनिश्चित करता है कि इंडेक्स सीमा से बाहर कभी नहीं गिर सकता है। ऐसे मामलों में, operator[] बेहतर है।

निम्नलिखित पाश पर विचार करें:

for(size_t i = 0 ; i < v.size(); ++i) 
{ 
    //Should I use v[i] or v.at(i)? 
} 

इस तरह के एक पाश में, operator[] हमेशा at() सदस्य समारोह की तुलना में एक बेहतर विकल्प है।

मैं at() पसंद करूंगा जब मैं अमान्य इंडेक्स के मामले में अपवाद फेंकना चाहता हूं, ताकि मैं catch{ ...} ब्लॉक में वैकल्पिक कार्य कर सकूं। अपवाद मदद से आप के रूप में असाधारण/वैकल्पिक कोड से सामान्य कोड को अलग:

try 
{ 
    size_t i = get_index(); //I'm not sure if it returns a valid index! 

    T item = v.at(i); //let it throw exception if i falls outside range 

    //normal flow of code 
    //... 
} 
catch(std::out_of_range const & e) 
{ 
    //alternative code 
} 

यहाँ आप i खुद जांच कर सकता है, यह सुनिश्चित करना है कि यह एक वैध सूचकांक है, और फिर at() के बजाय operator[] फोन है, लेकिन यह if-else ब्लॉक का उपयोग कर वैकल्पिक कोड के साथ सामान्य कोड मिश्रण करेगा जो कोड के सामान्य प्रवाह को पढ़ने में मुश्किल बनाता है। यदि आप ऊपर देखते हैं, तो try-catch कोड पठनीयता में सुधार करता है, क्योंकि यह वास्तव में वैकल्पिक कोड से सामान्य कोड को अलग करता है, जिसके परिणामस्वरूप एक साफ और साफ कोड होता है।

+4

"कोई भी नहीं कहता है"() 'बेहतर है" - हे! आप चौंक जाएंगे। –

+0

@ कोनराड रुडॉल्फ: क्या? – Nawaz

+7

कम मत समझें कि कितने बेवकूफ हैं, और उनमें से कितने सी ++ सिखाते हैं। ;-) –

10

at और [] के बीच फर्क सिर्फ इतना है कि at एक सीमा की जांच करता है, और [] नहीं करता है। यदि आपने पहले से ही सीमा की जांच की है या अपनी अनुक्रमणिका को इस तरह से बनाया है कि यह सीमा से बाहर नहीं हो सकता है, और बार-बार आइटम तक पहुंचने की आवश्यकता है, तो आप at के बजाय [] चुनकर कुछ CPU चक्र सहेज सकते हैं।एक ही चैक और कई के

उदाहरण तक पहुँचता है:

for (size_t i = 0 ; i != vect.size() ; i++) { 
    if (vect[i] > 42) { 
     // .... 
    } 
} 
0

अन्य उत्तर पूरी तरह से सही हैं, लेकिन हो सकता है:

size_t index = get_index(vect); 
if (index < 0 || index >= vect.size()) return; 
if (vect[index] > 0) { 
    // .... 
} else if (vect[index] > 5) { 
    // .... 
} else .... 

एक मामला है जहां सूचकांक के अंदर सीमा होने के लिए निर्माण किया है का उदाहरण इंप्रेशन दें कि कोड लिखते समय at() का उपयोग करना एक अच्छा विचार है कि आप अभी भी डिबगिंग करेंगे, क्योंकि इससे त्रुटि को संकेत मिलेगा। यह सामान्य रूप से मामला है, लेकिन अधिकांश व्यापक कंपाइलरों के लिए लागू नहीं होता है - जीसीसी को putting it in debug mode द्वारा निष्पादित (घातक) रेंज चेक करने के लिए सेट किया जा सकता है और कुछ ऐसा ही संभवतः विजुअल स्टूडियो में किया जा सकता है।

0

वेक्टर विधि सी ++ .at तब सीमाओं की जांच करें जब तत्व वेक्टर में मौजूद नहीं है और out_of_range अपवाद फेंक दिया गया है।

[] का उपयोग करते समय वेक्टर पर बाध्यता के लिए कोई जांच नहीं की जाती है, इसलिए यदि तत्व मौजूद नहीं है तो कोई अपवाद फेंक दिया गया है और नतीजा एक अनिर्धारित व्यवहार है जैसे कि वेक्टर में कोई पूर्ववर्ती elemnts के यादृच्छिक मूल्य नहीं है।

[] का उपयोग सुरक्षा की अवधि में at से बेहतर है, हालांकि इसे अधिक समय की आवश्यकता होगी और कार्यक्रम की परिधि में इसका असर होगा।

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