Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问C+中向量的元素+;?_C++_Vector - Fatal编程技术网

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

C++ 访问C+中向量的元素+;?,c++,vector,C++,Vector,我经常发现人们使用数组方括号[]和法向量函数。at()。为什么有两种不同的方法?两者的优点和缺点是什么?我知道.at()更安全,但是有没有任何情况下不能使用.at()呢?如果.at()总是更安全,为什么还要使用数组括号[] 我四处搜索,但找不到类似的问题。如果这样的问题已经存在,请转发给我,我将删除此问题。std::vector::at()通过抛出异常来防止您访问数组元素超出范围,而不像[]运算符在访问超出向量范围时不会发出警告或抛出异常 < C> STD::向量< /C> >被认为是C99中可

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

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

std::vector::at()
通过抛出异常来防止您访问数组元素超出范围,而不像
[]
运算符在访问超出向量范围时不会发出警告或抛出异常

< C> STD::向量< /C> >被认为是C99中可变长度数组(VLA)的C++替换/构造。为了通过
std::vector
轻松地重放c型数组,需要vector提供与数组类似的接口,因此vector提供了访问其元素的
[]
操作符。同时,C++标准委员会可能也觉得需要为代码< STD::向量>代码> C风格数组提供额外的安全性,因此他们也提供了<代码> STD::vector::()(代码)>提供代码。< /P>
自然地,
std::vector::at()
方法在取消引用之前检查向量的大小,这将比
[]
访问元素的开销稍大(在大多数用例中可以忽略不计),因此,
std::vector
为您提供了两种选择,一种是安全的,另一种是以牺牲自己管理安全为代价的更快的。下标运算符所涉及的键入更少,这使代码更清晰。另外,对C数组进行重构是很自然的。

正如其他人所提到的,
at()
执行边界检查,
[]
不执行。我认为选择
[]
有两个原因:

  • 更简洁的语法
  • 表演。当循环遍历向量的元素时,在每次迭代中执行边界检查通常是过分的,而且成本非常高

  • 个人选择

    有些人使用下标运算符的原因是,他们将其视为向量,类似于以这种方式访问项的数组。这种方式被简单地称为“语法糖”,这意味着它看起来更漂亮

    有些人喜欢
    []
    ,有些人喜欢
    。at()
    ,这是个人的选择

    技术选择

    假设您讨论的是仅访问,函数
    .at()
    执行边界检查,当您尝试访问超出边界的项时,它会引发异常。该函数“更安全”,但如果您自己处理边界检查,请随意使用下标运算符

    所以,实际上,您可以选择使用哪种样式的访问器

    没错。at()更安全,因为它将检查数组边界。运算符[]跳过检查,如果您进行非法访问,则未定义运算符[]

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

    at()

    优点:

    • 安全,因为在数组超出边界时引发异常
    缺点:

    • 慢速访问
    • 输入更多字符
    操作员[]

    优点:

    • 由于缺少边界检查,因此访问速度很快
    • 要键入的字符数减少
    • “直观”阵列元素访问
    缺点:

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

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


    参考
    at(size\u type\uu n){M\u range\u check(\uu n);返回(*this)[\uu n];}

    重新标记
    C
    Array
    是不相关的,因为C99是在STL之后发布的,我看不出std::vector与VLAs有什么关系。@JohnZwinck:我相信它们在正式纳入C标准之前已经作为编译器扩展得到了支持。谢谢。它完美地回答了这个问题。
    超出范围
    -->
    超出范围
    事实上,就你的第二点而言,执行边界检查是没有效率的。如果您知道自己是线程安全的(不是多线程的,也不是在CS中),并且没有改变循环中的向量,那么(int i=0;i将永远不会超出范围。无需使用
    at()