在C++中访问向量的元素?

fdh*_*fdh 35 c++ vector

我经常发现人们使用数组括号[]和法线向量函数.at().为什么有两种不同的方法?两者的好处和缺点是什么?我知道.at()更安全,但是有什么情况下不能使用.at()吗?如果.at()总是更安全,为什么要使用数组括号[].

我四处搜索但找不到类似的问题.如果这样的问题已经存在,请转发给我,我会删除这个问题.

Alo*_*ave 51

std::vector::at()通过抛出out_of_bounds异常来防止访问数组元素超出边界,这与运行时不同,[]当访问超出向量边界时不会发出警告或抛出异常.

std::vector是/被认为是c99中可变长度数组(VLA)的c ++替换/构造.为了能够容易地替换c样式的数组,std::vector需要向量提供与数组类似的接口,因此向量提供[]了访问其元素的操作符.与此同时,C++标准委员会也许认为需要为std::vector过度c型阵列提供额外的安全性,因此他们也提供std::Vector::at()了提供它的方法.

当然,at()方法在解除引用之前检查向量的大小,并且在访问元素时会有一些开销(在大多数用例中可能忽略不计)[],因此,std::vector为您提供安全或更快的选择,以牺牲管理安全自己.

  • 鉴于C99是在STL之后发布的,我没有看到std :: vector与VLA有什么关系. (6认同)
  • @JohnZwinck:我相信它们在被正式适应C标准之前已经被作为编译器扩展支持了. (3认同)

Jas*_*n B 13

正如其他人所提到的,at()执行边界检查而[]不是.我能想到的两个理由[]是:

  1. 更清晰的语法
  2. 性能.当循环遍历向量的元素时,在每次迭代上执行边界检查通常是过度的并且成本非常高.

  • 实际上,对于你的第二点,完全执行边界检查是低效的.如果你知道你是线程安全的(不是多线程或CS内部)并且你没有改变循环内的向量,那么`for(int i = 0; i <v.size(); i ++)`将永远不会出界.不需要使用`at()`! (3认同)

Fra*_*ank 10

at()

优点:

  • 安全,因为如果数组超出范围则抛出异常

缺点:

  • 访问速度慢
  • 输入更多字符

operator[]

优点:

  • 由于缺少边界检查而快速访问
  • 输入的字符越少
  • '直观'的数组元素访问

缺点:

  • 由于缺少边界检查而不安全