XZ Blog XZ Blog
首页
  • 人体姿态估计
  • 2D-3D-Lifting
  • 动作质量评估
  • 基于RGBD视觉信息的异常行为识别
  • 基于RGB视频的行为识别
  • 大模型应用
  • 网络结构

    • Transformer
    • GCN
    • Graph Transformers
    • Diffusion Model
  • 深度学习
  • 论文解读
  • 后端开发
  • Git
  • 博客搭建
  • Debug
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

xzhouzeng

@渐行。
首页
  • 人体姿态估计
  • 2D-3D-Lifting
  • 动作质量评估
  • 基于RGBD视觉信息的异常行为识别
  • 基于RGB视频的行为识别
  • 大模型应用
  • 网络结构

    • Transformer
    • GCN
    • Graph Transformers
    • Diffusion Model
  • 深度学习
  • 论文解读
  • 后端开发
  • Git
  • 博客搭建
  • Debug
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 后端开发

    • cmake介绍
    • \{}统一初始化方
    • C++11新特性
    • C++标准推荐使用标准库头文件
    • C++动态内存分配和静态的区别
    • C++类函数后面加const的作用
    • C++类和结构区别
    • C++内存区域
    • nullptr与NULL
    • priority_queue使用
    • string , cstring , string h 的区别
    • using与typedef定义别名区别
    • vector中[]和at访问区别
      • 常量指针和指针常量
      • 空类大小及相关介绍
      • 容器emplace与push操作
      • 数据结构操作——时间复杂度
      • 智能指针(Smart Pointers)
      • 最大堆的实现
    • Git

    • 博客搭建

    • Debug

    • python开发

    • 技术
    • 后端开发
    xzhouzeng
    2023-03-20
    目录

    vector中[]和at访问区别

    # vector中[]和at访问区别

    Created: March 19, 2024 11:46 AM

    在C++中,std::vector提供了两种访问元素的方法:operator[]和at()。这两种方法都可以用来访问或修改容器中的元素,但它们在安全性和性能方面存在差异:

    # operator[](下标运算符)

    • 性能:**operator[]**提供快速访问,因为它直接访问指定索引处的元素,没有进行任何边界检查。

    • 安全性:由于不进行边界检查,如果使用无效的索引访问元素,会导致未定义行为,可能包括访问无效内存,这可能引起程序崩溃或其他安全问题。

    • 用法示例:

      cppCopy code
      std::vector<int> v = {1, 2, 3};
      std::cout << v[1]; // 输出: 2
      v[1] = 20; // 修改元素
      
      
      1
      2
      3
      4
      5

    # at() 方法

    • 性能:**at()方法提供边界检查,如果尝试访问超出有效索引范围的元素,会抛出std::out_of_range异常。这个附加的边界检查使得at()比operator[]**慢一些,但通常这个性能差异非常小,除非在非常性能敏感的代码中。

    • 安全性:由于**at()在索引无效时会抛出异常,它提供了更高的安全性。这使得at()**成为在不确定索引是否有效时的首选方法。

    • 用法示例:

      cppCopy code
      std::vector<int> v = {1, 2, 3};
      try {
          std::cout << v.at(2); // 输出: 3
          v.at(2) = 30; // 修改元素
          std::cout << v.at(10); // 这会抛出std::out_of_range异常
      } catch (const std::out_of_range& e) {
          std::cerr << "Error: " << e.what() << '\n';
      }
      
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10

    # 总结

    • 使用**operator[]**时,你需要自己确保索引的有效性,它适用于性能关键的场景或当你确信索引一定在有效范围内时。
    • **at()**更适合用在可能存在索引越界风险的场景,或者当程序的健壮性和安全性比绩效更重要时。

    选择哪一种方法取决于具体的使用场景和对性能与安全性的需求。

    编辑 (opens new window)
    using与typedef定义别名区别
    常量指针和指针常量

    ← using与typedef定义别名区别 常量指针和指针常量→

    最近更新
    01
    VideoLLMs
    03-20
    02
    Video2Script
    12-07
    03
    多模态
    11-09
    更多文章>
    Theme by Vdoing | Copyright © 2022-2024 xzhouzeng | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式