c++ vector下标_vectorat

c++ vector下标_vectoratC语言(加了层语法糖的汇编)为了性能并不支持数组的越界检查,每次检查会多付出2-3倍的时间。而vector以at的形式支持越界检查,但也支持C语言风格的[]高效访问,没错C++提供了足够的自由。当要获取std::vector的第n个元素,下面几种方式都可以:  std::vector<int>vec; size_tn=1; in…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

C语言(加了层语法糖的汇编)为了性能并不支持数组的越界检查,每次检查会多付出2-3倍的时间。

而vector以at的形式支持越界检查,但也支持C语言风格的[]高效访问,没错C++提供了足够的自由。

当要获取 std::vector 的第 n 个元素,下面几种方式都可以:

 
  1. std::vector<int> vec;

  2. size_t n = 1;

  3. int & i = vec[n];

  4. int & j = *(vec.begin() + n);

  5. int & k = vec.at(n);

但是如果 n 超过了 vector 的下标范围,在几种方式的结果就有区别了。

在 linux 平台只有 at(n) 会抛出 std::out_of_range 异常,而其他两个都不会。

 查看标准模板库代码,可以看到:

 
  1. // element access

  2. /**

  3. * @brief Subscript access to the data contained in the %vector.

  4. * @param n The index of the element for which data should be

  5. * accessed.

  6. * @return Read/write reference to data.

  7. *

  8. * This operator allows for easy, array-style, data access.

  9. * Note that data access with this operator is unchecked and

  10. * out_of_range lookups are not defined. (For checked lookups

  11. * see at().)

  12. */

  13. reference

  14. operator[](size_type __n)

  15. { return *(this->_M_impl._M_start + __n); }

有说明:通过 operator[] 获取数组元素,不会检查下标有效性,需要检查的时候使用 at 接口

在 windows 平台 VS 环境下,都会抛出异常,VC 下的标准库是这样现实的:

 
  1. reference operator[](size_type _Pos)

  2. { // subscript mutable sequence

  3.  
  4. #if _HAS_ITERATOR_DEBUGGING

  5. if (size() <= _Pos)

  6. {

  7. _DEBUG_ERROR("vector subscript out of range");

  8. _SCL_SECURE_OUT_OF_RANGE;

  9. }

  10. #endif /* _HAS_ITERATOR_DEBUGGING */

  11. _SCL_SECURE_VALIDATE_RANGE(_Pos < size());

  12.  
  13. return (*(_Myfirst + _Pos));

  14. }

在 Debug 配置下, _HAS_ITERATOR_DEBUGGING 默认定义为 1,但是即使强制定义为 0,也有异常,因为还有一个 _SCL_SECURE_VALIDATE_RANGE 检查。所以即使在 Release 配置下,下标检查也是存在的。

如果把上面的代码中的“引用”符号去掉,像这样:

 
  1. std::vector<int> vec;

  2. size_t n = 1;

  3. int i = vec[n];

  4. int j = *(vec.begin() + n);

  5. int k = vec.at(n);

那么 at(n) 仍然会抛出 std::out_of_range 异常,其他两个会出现什么情况呢,也许是内存访问异常,也许是其他诡异的错误。

在 vec 非空的情况下,即使下标越界,也有可能对应的内存是可读写的,至于读到的是什么内容,或者写到什么地方,就是随机事件了。

所以尽量用 at 接口,让错误尽早暴露出来。

源链接:https://blog.csdn.net/luansxx/article/details/10194171

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188404.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux pycharm2021激活码[在线序列号]

    linux pycharm2021激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    127
  • C++ 数值与 string 的相互转换

    C++ 数值与 string 的相互转换使用函数模板将基本数据类型(整型、字符型、实型、布尔型)转换成string。//ostringstream对象用来进行格式化的输出,常用于将各种类型转换为string类型//ostringstream只支持&amp;lt;&amp;lt;操作符template&amp;lt;typenameT&amp;gt;stringtoString(constT&amp;amp;t){ostringstreamoss;//创建一个格式化输出流

    2022年5月14日
    32
  • 成长之路——InfoQ视频心得笔记[通俗易懂]

    这期是普元信息的主任架构师,顾伟! 视频地址: http://mp.weixin.qq.com/s/0KE_CCU3cWwzvr7D5ENtsQ少年,在路上!不卑不亢!!!1:换维思考 墨菲定律:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会做出这种选择。彼得定律:向上爬的定律!错误和面对压力方面的表现!犯错:积累沉淀,不要犯相同的错误两次!2:人

    2022年2月25日
    33
  • Java 中位数_中位数众数平均数三者关系

    Java 中位数_中位数众数平均数三者关系列举一些中位数和众数的常见问题和解法1.众数一个长度为$N$的列表,出现次数大于$\left\lfloorN/2\right\rfloor$的数为这个列表的众数。1.1摩尔投票算法摩尔投票算法(Boyer-Mooremajorityvotealgorithm)的思路类似一个大乱斗,遇到不相同的数就抵消掉。维护两个变量:major和count,major是众数的可能值,count是…

    2022年9月17日
    0
  • 鼠标滚轮编码器工作原理_速度编码器工作原理

    鼠标滚轮编码器工作原理_速度编码器工作原理鼠标滚轮一旦出现滚动跳动,不连贯,基本都要换,修鼠标会经常遇到,好奇之下想了解一下这个小东西的原理。滚轮一端插在这个转盘里面,我们滚动滚轮时候,转盘被带动旋转,产生脉冲信号,电脑依靠这个信号判断滚轮的旋转方向和速度。我们拆一个机械编码器来看看。就是这个小东西,特别简单有没有,一共就4个零件最左边是铁壳,上面一般会有厂家信息,安装高度,和寿命等比如这个,安装高度10毫米,寿命500万圈。PS:一般普通的鼠标,都是选用安装高度为11mm,但还是要自己量清楚。这里需要注意的是,安装

    2022年9月30日
    0
  • jetbrains系列软件汉化图文教程

    idea 激活码,jetbrains系列软件汉化图文教程

    2022年3月13日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号