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)
上一篇 2026年4月16日 下午6:43
下一篇 2026年4月16日 下午6:49


相关推荐

  • arcpy批量裁剪

    arcpy批量裁剪arcpy 批量裁剪

    2026年3月16日
    3
  • 给自己的XTC820摆拍一下。[通俗易懂]

    给自己的XTC820摆拍一下。[通俗易懂]上个月入手了捷安特的XTC820,始终没有时间为爱车拍几张照,今天凑着在办公室的机会,就随手拍了几张,展示一下XTC820。先给大家看图片,然后再分享一下当初我买它的原因以及车的规格。下面就来简单说一下我为什么选择这个XTC系列?主要是考虑路面问题,目前上海的道路坑坑洼洼,铺装路面的自行车不太适合,…

    2025年8月24日
    5
  • 分布式锁的场景以及实现方案_redis分布式锁使用场景

    分布式锁的场景以及实现方案_redis分布式锁使用场景分布式锁应用场景/实现方案

    2025年10月8日
    5
  • navicat连接sqlserver出现im002错误

    navicat连接sqlserver出现im002错误遇到如下错误 navicatpremi IM002 Microsoft ODBC 驱动程序管理器 未发现数据源名称并且未指定默认驱动程序解决方法 找到安装目录文件 sqlncli x64 msi 双击安装就可以解决 注 https www jianshu com p d92ef55cd1bb

    2026年3月26日
    2
  • 比特和字节以及有关换算

    比特和字节以及有关换算字节和 bit 的区别比特 bit 比特 b 是表示信息的最小单位 同时也是二进制数字中的位 计算机专业术语 是信息量单位 是由英文 BIT 音译而来 二进制数的一位所包含的信息就是一比特 如二进制数 0100 就是 4 比特 简单来说 bit 比特 是表示数字信号数据的最小单位字节字节 Byte 是计算机信息技术用于计量存储容量的一种计量单位 也表示一些计算机编程语言中的数据类型和语言字符 一个字节存储 8 位无符号数 储存的数值范围为 0 255 如同字元一样 字节型态的变数只需要用一个位元组 8 位元 的内存空间储存

    2026年3月16日
    2
  • What is Observer and Observable and when we used these?

    What is Observer and Observable and when we used these?

    2022年1月6日
    34

发表回复

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

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