0

0

C++ vector怎么用 C++动态数组增删改查操作汇总【STL】

穿越時空

穿越時空

发布时间:2026-01-24 10:40:05

|

527人浏览过

|

来源于php中文网

原创

push_back()和insert()在capacity不足时会触发内存重分配,导致迭代器、指针、引用全部失效;pop_back()、erase()和clear()均不改变capacity。

c++ vector怎么用 c++动态数组增删改查操作汇总【stl】

vector 增删元素时,哪些操作会触发内存重分配?

调用 push_back()insert() 时,若当前容量(capacity())不足,vector 会重新分配更大内存块(通常是 1.5× 或 2× 当前容量),把旧元素拷贝/移动过去,再释放旧内存。这意味着所有原有迭代器、指针、引用立即失效。

避免频繁重分配的方法:

  • 预先用 reserve(n) 分配足够空间(尤其已知元素总数时)
  • emplace_back() 替代 push_back() 减少临时对象构造开销
  • pop_back()erase() 不影响 capacity,但 clear() 也不缩容——如需真正释放内存,得写 vector().swap(v)

用下标访问和 at() 的区别在哪?

v[i] 是裸访问,不检查越界,行为未定义(常见 crash 或静默读错内存);v.at(i) 会做边界检查,越界抛出 std::out_of_range 异常。

适用场景:

立即学习C++免费学习笔记(深入)”;

Trickle AI
Trickle AI

多功能零代码AI应用开发平台

下载
  • 性能敏感且确定索引合法 → 用 [i]
  • 调试阶段或用户输入作为索引 → 必须用 at(i)
  • 注意:front()back() 同样不检查空容器,调用前务必确认 !v.empty()

删除元素时,erase-remove 惯用法为什么不能直接删单个值?

erase() 删除的是迭代器位置,不是值;想删掉所有等于某值的元素,不能写 v.erase(5)(语法错误),而要用 std::remove 移动元素 + erase() 截断:

v.erase(std::remove(v.begin(), v.end(), 5), v.end());

如果只删第一个匹配项:

  • std::find() 找到迭代器,再传给 erase()
  • 例如:auto it = std::find(v.begin(), v.end(), 5); if (it != v.end()) v.erase(it);
  • 注意:remove 不是真正删除,只是把保留元素移到前面,返回新逻辑尾部迭代器

vector 作为函数参数传值、传引用、移动语义怎么选?

传参方式直接影响性能和语义:

  • 只读访问 → const std::vector&(避免拷贝,禁止修改)
  • 需要修改原容器 → std::vector&(如批量 push 或 clear)
  • 函数内部要“接管”数据且原变量后续不再使用 → std::vector&& + std::move()
  • 不要默认传值:哪怕 vector 很小,拷贝仍涉及 size/capacity/指针三字段复制 + 内存分配(除非 T 是 trivial 类型且你明确控制了 small buffer 优化)

vector 的内存布局是连续的,但它的“大小”不等于 sizeof(vector) —— 后者通常只有 24 字节(64 位系统下三个指针),真正数据在堆上。这点常被忽略,导致误判拷贝开销。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

765

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

527

2023.09.20

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

574

2023.08.10

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.8万人学习

Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号