Ich weiß, dass dies at()
langsamer ist als []
aufgrund seiner Grenzprüfung, die auch in ähnlichen Fragen wie C ++ Vector bei / [] Operatorgeschwindigkeit oder :: std :: vector :: at () vs Operator [] << überraschende Ergebnisse diskutiert wird !! 5 bis 10 mal langsamer / schneller! . Ich verstehe einfach nicht, wozu die at()
Methode gut ist.
Wenn ich einen einfachen Vektor wie diesen habe: std::vector<int> v(10);
und ich beschließe, auf seine Elemente zuzugreifen , indem ich ihn at()
anstelle von []
in Situationen verwende, in denen ich einen Index habe, i
und ich nicht sicher bin, ob er in Vektoren begrenzt ist, zwingt er mich, ihn mit try-catch zu umschließen Block :
try
{
v.at(i) = 2;
}
catch (std::out_of_range& oor)
{
...
}
Obwohl ich in der Lage bin, das gleiche Verhalten zu erzielen, size()
indem ich den Index selbst verwende und überprüfe, was für mich einfacher und bequemer erscheint:
if (i < v.size())
v[i] = 2;
Meine Frage lautet also:
Welche Vorteile bietet die Verwendung von vector :: at gegenüber vector :: operator [] ?
Wann sollte ich vector :: at anstelle von vector :: size + vector :: operator [] verwenden ?
if (i < v.size()) v[i] = 2;
einen möglichen Codepfad gibt, 2
der keinem Element von v
überhaupt zugewiesen wird . Wenn das das richtige Verhalten ist, großartig. Aber oft gibt es nichts Sinnvolles, was diese Funktion tun kann, wenn i >= v.size()
. Es gibt also keinen besonderen Grund, warum keine Ausnahme verwendet werden sollte, um auf eine unerwartete Situation hinzuweisen. Viele Funktionen werden nur operator[]
ohne Überprüfung der Größe und des Dokuments verwendet, i
das sich in Reichweite befinden muss, und geben dem Anrufer die Schuld an der resultierenden UB.