मुझे पता है कि इसकी सीमा जाँच की वजह 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
सीमा में होने चाहिए, और कॉलर पर परिणामी यूबी को दोष देते हैं।