在访问向量元素时,使用at
和方括号[]
之间是否存在任何差异?
我看到同样的人更喜欢myvector.at()
以上myvector[]
,是否有更优先的东西,比如在某些情况下表现更好,或者与其他语言相同?
答案 0 :(得分:5)
主要区别在于operator[]
未选中,如果您尝试访问超出向量范围的内存,将导致未定义的行为,而.at
会对索引进行检查并将抛出{{ 3}}例外,如果你尝试访问内存超出范围
答案 1 :(得分:4)
std::vector::at
和std::vector::operator[]
之间的区别在于,如果索引无效,at
将抛出std::out_of_range
异常,而operator[]
将导致未定义的行为索引无效。
你强烈喜欢at
的唯一原因是你的算法依赖于因越界输入而抛出的异常。这似乎是一个非常罕见的用例,因为在任何索引操作之前通过认真使用size()
来避免越界访问是直截了当的,因此越界访问通常只是编程错误
假设越界访问是一个错误而不是一个有效的执行路径,at
vs operator[]
的细分如下:
at
:
operator[]
:
总的来说,我倾向于几乎总是使用operator[]
,并根据我的需要选择优化版本或调试版本。将错误转换为运行时错误很少有用。
答案 2 :(得分:0)
v.at(i)
检查i
是否为有效索引(即0 <= i < v.size()
),如果不是则抛出异常。 v[i]
不执行此类检查,只是尝试访问底层缓冲区,并且如果i
无效,将(可能)发生段错误。
如果您知道索引有效,我会使用[]
。
*正如Mankarse所说,访问数组的边界是未定义的行为。 UB的这个特定实例经常导致段错误,但也可以做其他你不想要/不期待的事情。