मुझे पता है कि इसकी सीमा जाँच की वजह at()से यह धीमी है [], जो C ++ वेक्टर एट / [] ऑपरेटर गति या :: std :: वेक्टर :: at () बनाम ऑपरेटर [] << आश्चर्यजनक परिणामों जैसे समान प्रश्नों पर भी चर्चा की गई है !! 5 से 10 गुना धीमा / तेज! । मुझे अभी समझ में नहीं आया कि यह at()विधि किस लिए अच्छी है।
यदि मेरे पास इस तरह का एक सरल वेक्टर है: std::vector<int> v(10);और मैं स्थिति के at()बजाय इसके तत्वों का उपयोग करने का निर्णय लेता हूं []जब मेरे पास एक सूचकांक होता है iऔर मुझे यकीन नहीं है कि अगर वैक्टर में इसकी सीमा होती है, तो यह मुझे इसे पकड़ने की कोशिश करने के लिए मजबूर करता है ब्लॉक करें :
try
{
v.at(i) = 2;
}
catch (std::out_of_range& oor)
{
...
}
हालांकि मैं size()अपने दम पर सूचकांक का उपयोग और जाँच करके एक ही व्यवहार करने में सक्षम हूं, जो मेरे लिए आसान और बहुत सुविधाजनक लगता है:
if (i < v.size())
v[i] = 2;
तो मेरा सवाल है: वेक्टर
का उपयोग करने के क्या फायदे हैं : वेक्टर पर अधिक :: ऑपरेटर [] ?
मुझे वेक्टर :: आकार + वेक्टर :: ऑपरेटर [] के बजाय वेक्टर का उपयोग कब करना चाहिए ?
if (i < v.size()) v[i] = 2;एक संभावित कोड पथ है जो 2किसी भी तत्व को निर्दिष्ट नहीं करता है v। अगर यह सही व्यवहार है, महान। लेकिन अक्सर समझदार कुछ भी नहीं है कि यह फ़ंक्शन कब कर सकता है i >= v.size()। इसलिए कोई विशेष कारण नहीं है कि अप्रत्याशित स्थिति को इंगित करने के लिए अपवाद का उपयोग नहीं करना चाहिए । कई फ़ंक्शन केवल operator[]आकार, दस्तावेज़ के खिलाफ जांच के बिना उपयोग करते हैं, जो iसीमा में होने चाहिए, और कॉलर पर परिणामी यूबी को दोष देते हैं।