我经常发现人们使用数组括号[]和法线向量函数.at()。为什么有两种不同的方法?两者的好处和缺点是什么?我知道.at()更安全,但是有什么情况下不能使用.at()吗?如果.at()总是更安全,为什么要使用数组括号[]。
我四处搜寻但找不到类似的问题。如果这样的问题已经存在,请转发给我,我将删除此问题。
答案 0 :(得分:50)
std::vector::at()
通过抛出out_of_bounds
异常来防止访问数组元素超出范围,这与[]
运算符不同,std::vector
运算符在访问超出向量边界时不会发出警告或抛出异常。
std::vector
被认为是c99中可变长度数组(VLA)的c ++替换/构造。为了使{-1}}可以轻松替换c样式数组,需要向量提供与数组类似的接口,因此向量提供[]
运算符来访问其元素。与此同时,C ++标准委员会也许认为需要为std::vector
提供c风格数组的额外安全性,因此他们还提供了提供它的std::Vector::at()
方法。
当然,at()
方法在解除引用之前检查向量的大小,并且在[]
访问元素时会有一点开销(在大多数用例中可能忽略不计),所以{{1为您提供安全或更快的选择,以牺牲自己的安全管理为代价。
答案 1 :(得分:12)
正如其他人所提到的,at()
执行边界检查而[]
没有。我可以考虑选择[]
的两个原因是:
答案 2 :(得分:10)
<强> at()
强>
优点:
缺点:
<强> operator[]
强>
优点:
缺点:
答案 3 :(得分:2)
个人选择
有些人使用下标运算符的原因是它们直观的向量类似于访问项目的数组这种方式简单地被称为“语法糖”意味着它使它看起来更好。
有些人更喜欢[]
,有些人更喜欢.at()
,这是个人选择。
技术选择
假设您只讨论访问权限,函数.at()
会进行边界检查,并在您尝试访问超出边界的项目时抛出异常。该函数“更安全”,但如果您正在处理自己的边界检查,请随意使用下标操作符!
因此,您可以自行选择使用哪种访问方式!
答案 4 :(得分:2)
你是对的.at()更安全,因为它会检查数组边界。 operator []跳过检查,如果您进行非法访问,则不确定。
C / C ++中的传统数组访问从未进行过数组边界检查,而在Java推出之前的90年代,许多人认为它会增加不可接受的开销。我认为,总的来说,今天这种情况并非如此,并且它并不像许多人当时所认为的那样真实。我确信在某些情况下这很重要,但总的来说,如果您发现需要这么做的话,最好先安全开关。
答案 5 :(得分:1)
下标运算符涉及的输入较少,这使得代码更加清晰。此外,自然地重构C阵列或从C阵列重构。
答案 6 :(得分:1)
我使用STLPort 5.2.
似乎at()
会进行范围检查。
参考at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }