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
कोड पठनीयता में सुधार करता है, क्योंकि यह वास्तव में वैकल्पिक कोड से सामान्य कोड को अलग करता है, जिसके परिणामस्वरूप एक साफ और साफ कोड होता है।
"क्या अंतर है?" एक अच्छा सवाल है। जवाब है: 1) स्वत: रेंज जांच (.at() एक ऑफ-ऑफ-रेंज अपवाद फेंक देगा, [] चुपचाप विफल हो जाएगा), और 2) व्यक्तिगत वरीयता - आपको कौन सा सिंटैक्स बेहतर पसंद है। "कौन सा बेहतर है?", दूसरी ओर एक मूल्य निर्णय है। जवाब जरूरी है "यह निर्भर करता है"। IMHO ... – paulsm4
कोई भी बेहतर नहीं है, वे _similar लेकिन different_ उद्देश्यों की सेवा करते हैं। –