- 最主要的区别就是
.at()
会额外检查访问是否越界,如果越界,会抛出exception
,所以使用.at()
时程序运行速度较慢。
二者优点
-
一般来说用
[]
效率更高,尤其是需要对索引值进行复杂的计算或者单纯不需要检查是否越界时。 -
更好的做法是默认用
.at()
,这样代码尽管很慢但不会产生bug;[]
更适合对程序效率要求比较高的场景。
[]
缺点
- 索引值越界时程序不会报错,但会一路莽下去,在向量非空的情况下,即使下标越界,也有可能对应的内存是可读写的,至于读到的是什么内容,或者写到什么地方,就是随机事件了。
- 由于
[]
不做边界检查,哪怕越界了也会返回一个引用,当然这个引用是错误的引用,如何不小心调用了这个引用对象的方法,会直接导致应用退出。
处理.at()
越界访问
我们用try
可以catch
out_of_bound exception
:
try {
cout << "Out of range element value: "
<< v.at(container_size + 10) << "/n.";
} catch(const out_of_range &e) {
cout << "Ooops, out of range access detected: "
<< e.what() << "/n."
}```