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

Accessing elements of a vector in C++?

本文关键字:元素 向量 访问 C++      更新时间:2023-10-16

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

我四处寻找,但找不到类似的问题。如果已经存在这样的问题,请将我转发给它,我将删除此问题。

std::vector::at()通过抛出std::out_of_range异常来保护您不越界访问数组元素,而[]运算符在访问超出向量边界时不会发出警告或抛出异常。

CCD_ 4被认为是c99中可变长度阵列(VLA(的C++替换/构造。为了使c型阵列能够容易地被std::vector替换,需要向量提供与阵列类似的接口,因此向量提供了[]运算符来访问其元素。同时,C++标准委员会可能也认为有必要为std::vector提供额外的安全性,而不是C型阵列,因此他们也提供了std::vector::at()方法来提供它

当然,std::vector::at()方法在取消引用向量之前会检查向量的大小,这将是[]访问元素的一点开销(在大多数用例中可能可以忽略不计(,因此std::vector为您提供了安全或更快的选择,而牺牲了您自己的安全管理。

正如其他人所提到的,at()执行边界检查,而[]不执行。我能想到的喜欢[]的两个原因是:

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

at()

优点:

  • 安全,因为如果数组超出界限就会引发异常

缺点:

  • 慢速访问
  • 要键入的更多字符

operator[]

优点:

  • 由于缺少边界检查而导致的快速访问
  • 要键入的字符较少
  • "直观"的阵列元素访问

缺点:

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

你是对的。at((更安全,因为它会检查数组边界。operator[]跳过检查,如果您进行非法访问,则它是未定义的。

传统的C/C++中的数组访问从未进行过数组边界检查,早在Java引入之前的90年代,许多人就认为这会增加不可接受的开销。我相信,总的来说,这在今天是不真实的,也不像当时许多人相信的那样真实。我相信在某些情况下这很重要,但总的来说,如果你发现有迫切的需要,你最好从安全开始并切换。

个人选择

有些人使用下标运算符的原因是,他们直观地认为向量类似于数组访问项。这种方式被简单地称为"语法糖",这意味着它看起来更好。

有些人更喜欢[],而另一些人则喜欢.at(),这是个人的选择。

技术选择

假设您只讨论访问,函数.at()会进行边界检查,当您试图访问超出边界的项时,它会抛出异常。该函数"更安全",但如果您自己处理边界检查,请随意使用下标运算符!

因此,实际上,您可以选择使用哪种风格的访问器!

下标运算符所涉及的类型较少,这使得代码更加清晰。此外,对C数组进行重构是很自然的。

我使用STLPort 5.2.似乎at()进行范围检查。

参考at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }