我们先定义一个数组vector<int>v(10),v[]和v.at()都可以对v中元素进行访问,一般大家使用的都是v[]这种访问方法,以至于我一度都将v.at()这种访问方式忘记了。
不过这两种访问元素的方式有什么区别呢?.v[]和v.at()都可以对v中元素进行访问,并且访问的元素时都不能越界,比如a[10]或a.at(10)这样的使用会报错。区别在于,operator[]不做边界检查, 哪怕越界了也会返回一个引用,当然这个引用是错误的引用,如何不小心调用了这个引用对象的方法,会直接导致应用退出。而由于at会做边界检查,如果越界,会抛出异常,应用可以try catch这个异常,应用还能继续运行。
比如我们运行下面代码:
vector<int>v;
cout << v[0] << endl;
会直接报错:
运行.at代码:
vector<int>v;
cout << v.at(0) << endl;
则会报异常:
使用try,catch:
vector<int>v;
try
{
cout << v[0] << endl;
}
catch (const exception& e)
{
cerr << e.what() << endl;
}
catch (...)
{
cerr << "error" << endl;
}
此时输出异常信息: