在C++中访问向量的元素
Accessing elements of a vector in C++?
我经常发现人们使用方括号[]和法向量函数.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()
执行边界检查,而[]
不执行。我能想到的喜欢[]
的两个原因是:
- Cleaner语法
- 性能。当循环遍历向量的元素时,在每次迭代中执行边界检查通常是过度的,而且成本非常高
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]; }
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- C++:如何循环通过向量中的整数元素
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 不允许在向量中添加更多元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用并行参数向量调用元素向量的成员函数
- C++ 查找字符串中存在的元素向量
- 包含 std::threads 的元素向量
- 避免从单一元素向量转换为基元类型
- 对自定义元素向量进行排序时出现意外(至少对我来说)行为
- 如何为对元素(向量和int)配对创建unique_ptr也是unique_ptr
- 元素向量乘法 C++(代码不起作用)
- 时间和空间复杂性在二叉树的每个级别创建元素向量(NON-BST)
- 遍历结构元素向量
- 犰狳C++中的元素向量或矩阵乘法
- 为什么'std::vector<int> b{2};'创建 1 元素向量,而不是 2 元素向量?
- 可移动元素向量的大小调整是否有效?
- 唯一元素向量的c++模板函数
- 获取索引和元素-向量问题
- 定义一个生成元素向量的函数时,正确的方法是什么?