赞
踩
边界检查:
std::vector<int> v = {1, 2, 3};
int a = v[5]; // 崩溃
int b = v.at(5); // 抛出 std::out_of_range 异常
operator[]
:不进行边界检查,如果越界,比如访问-1位置,程序会直接崩溃,且不知道哪里出了问题,就算是debug模式下也不知道。at
:进行边界检查。如果访问的索引超出范围,会抛出一个 std::out_of_range
异常,在debug模式下,可以查看堆栈,追踪到抛出异常的位置,进行修复。Exception at 0x7ffd5a6fba99, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in MSVCP140D!std::_Xout_of_range
性能:
std::vector<int> v = {1, 2, 3};
for (size_t i = 0; i < v.size(); ++i)
{
int a = v[i]; // 已知索引合法
}
int index = getUserInput();
int b = v.at(index); // 索引可能不合法,需检查
operator[]
:由于没有边界检查,比 at
更快。at
:由于需要进行边界检查,会有一些额外的开销,适合在不确定索引是否合法的情况下使用。总结:
operator[]
可以在性能要求较高且能够确保索引合法的情况下使用。at
可以在需要安全访问并希望捕获可能的越界错误的情况下使用。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。