C++ vector常用方法_C++ vector容器高频使用函数汇总

发布时间 - 2026-01-09 00:00:00    点击率:
size() 返回当前元素个数,capacity() 返回已分配内存可容纳的元素总数;resize(n) 改变 size() 并可能初始化新元素,reserve(n) 仅预分配 capacity() 不改变 size()。

vector 的 size() 和 capacity() 到底有什么区别?

很多人调用 size() 看到 10 就以为内存占了 10 个元素的空间,其实不一定。size() 返回当前实际存了多少个元素,capacity() 才是底层分配的连续内存能容纳多少个——它往往 ≥ size(),因为 vector 会预留空间避免频繁 realloc。

  • 插入大量数据前,用 reserve(n) 预分配容量,可避免多次拷贝重分配(尤其对非 trivial 类型)
  • resize(n) 会改变 size():若 n > size(),末尾补默认构造对象;若 n ,直接截断(已析构)
  • shrink_to_fit() 是非强制请求,编译器可能忽略;想真正释放多余内存,得靠 swap 技巧:
    std::vector(v).swap(v);

用 at() 还是 [] 访问元素?什么时候会抛异常?

operator[] 不做边界检查,越界是未定义行为(常见 crash 或静默脏读);at(index) 会检查,越界时抛 std::out_of_range 异常。

  • 调试阶段建议优先用 at(),上线后若确定索引安全、且性能敏感,再换 []
  • 迭代器失效场景下(如 push_back() 触发扩容),所有已有迭代器、指针、data() 返回的地址都失效,但 at()[] 只依赖 index,不受影响
  • 注意:空 vector 调用 front()back() 同样是未定义行为,必须先判空

erase() 删除元素为什么容易出错?怎么安全批量删?

erase(iterator) 返回下一个有效迭代器,不是 void;如果写成 v.erase(it++); 就跳过下一个元素——因为 it++ 先返回旧值再自增,而 erase 已让旧 it 失效。

  • 单删推荐写法:
    it = v.erase(it); // 安全,it 指向原 it+1
  • 删满足条件的多个元素,用 remove-erase 惯用法:
    v.erase(std::remove_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; }), v.end());
  • 不要在循环中用 for (int i = 0; i 边删边改 size,会导致漏删或越界;改用反向遍历或 while + erase 返回值

vector 是特化,别把它当普通容器用

std::vector 是 C++ 标准强制要求的位压缩特化,它不存储 bool 对象,而是把 8 个 bool 打包进 1 字节。这导致几个关键差异:

  • operator[] 返回的是代理对象 std::vector::reference,不是 bool&,所以不能取地址:
    bool* p = &v[0]; // 编译失败
  • 迭代器不是原生指针,std::vector::iterator 是自定义类,某些算法(如需要指针算术的)可能不兼容
  • 若需布尔数组且要支持取址、稳定迭代器,改用 std::dequestd::vector(用 0/1 代替 false/true)

vector 的“常用”背后藏着不少隐式契约:capacity 变化时机、迭代器失效规则、特化陷阱……这些不显眼的地方,才是线上 bug 最爱藏身的位置。


# 字节  # c++  # 区别  # 为什么  # for  # while  # bool  # char  # int  # void  # 循环  # 指针  # operator  # 对象  # 算法  # bug  # 特化  # 迭代  # 才是  # 多少个  # 的是  # 几个  # 多个  # 什么时候  # 已有  # 很多人 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel如何使用Blade模板引擎?(完整语法和示例)  使用C语言编写圣诞表白程序  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何用AWS免费套餐快速搭建高效网站?  如何在IIS中新建站点并配置端口与IP地址?  QQ浏览器网页版登录入口 个人中心在线进入  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何用虚拟主机快速搭建网站?详细步骤解析  Laravel如何使用模型观察者?(Observer代码示例)  Laravel中的Facade(门面)到底是什么原理  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  javascript日期怎么处理_如何格式化输出  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  如何在万网开始建站?分步指南解析  独立制作一个网站多少钱,建立网站需要花多少钱?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  北京网站制作公司哪家好一点,北京租房网站有哪些?  5种Android数据存储方式汇总  Laravel如何创建自定义Artisan命令?(代码示例)  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Laravel如何集成Inertia.js与Vue/React?(安装配置)  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何在阿里云域名上完成建站全流程?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  动图在线制作网站有哪些,滑动动图图集怎么做?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  个人网站制作流程图片大全,个人网站如何注销?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  如何快速搭建高效简练网站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  西安专业网站制作公司有哪些,陕西省建行官方网站?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程