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, iund 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, 2der 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, idas sich in Reichweite befinden muss, und geben dem Anrufer die Schuld an der resultierenden UB.