当前位置: 首页 > news >正文

【C++】STL详解(三)—vector使用手册:不看你会后悔

  1. 存储方式:与数组一样,vector使用连续内存空间存储元素,因此可以通过下标随机访问,时间复杂度为O(1)
  2. 动态扩容:与普通数组不同,vector的大小可以动态改变。当空间不足时,会分配新的更大内存,把原有元素拷贝过去,再释放旧空间。
  3. 空间策略:vector预留额外空间来减少频繁扩容。不同实现的扩容策略不同,但通常是以倍数方式增长,从而保证均摊插入复杂度为O(1)
  4. 性能特点:
    • 访问元素效率高(支持随机访问)。
    • 在末尾插入/删除效率高。
    • 在中间或开头插入/删除效率低(需要移动大量元素)。

👉 一句话总结:vector是 C++ 中最常用的容器,本质是一个能自动扩容的动态数组,既有数组的高效访问,又比数组更灵活。

二、vector的使用

1.vector的定义方式

构造一个空的 vector(任意类型)

注意:这只是一个示例,注意是任意类型,不止如下的类型

代码语言:javascript

AI代码解释

vector<int> v1; //构造int类型的空容器 vector<double> v2; //构造double类型的空容器 vector<char> v3; //构造char类型的空容器 vector<string> v4; //构造string类型的空容器

构造一个含有 n 个元素的 vector,每个元素的值都是 val

vector<类型> v1(n个元素,值val);

代码语言:javascript

AI代码解释

vector<int> v1(10,2); vector<double> v2(10,0.0); vector<char> v3(10,'d');

拷贝构造函数,用已有的 vector 构造新的 vector

代码语言:javascript

AI代码解释

vector<int> v1(v2); //拷贝构造int类型的v2容器的复制品

用区间 [first, last) 中的元素构造 vector

代码语言:javascript

AI代码解释

vector<int> v2(v1.begin(), v1.end()); //使用迭代器拷贝构造v2容器的某一段内容

在这里插入图片描述


2.迭代器的使用

vector中,迭代器的底层实现通常就是一个普通指针,因为vector的元素存储在连续的内存空间里,用指针就能完成迭代器的所有功能。因此在vector阶段,迭代器本质上等同于指针。但在其他容器(如listmap)中,元素存储方式不同,不一定是连续内存,这时迭代器并不是单纯的指针,而是一个封装了指针行为的类对象,通过运算符重载来模拟“像指针一样使用”。


begin和end

begin函数可以得到容器中第一个元素的正向迭代器,通过end函数可以得到容器中最后一个元素的下一个位置的正向迭代器。

在这里插入图片描述

代码语言:javascript

AI代码解释

int main() { vector<int> v(6, 6); vector<int>::iterator it = v.begin(); while (it != v.end()) { cout << *it << " " ; ++it; } cout << endl; return 0; }

此处仅展示普通vector对象的迭代器使用,因为容器的迭代器的使用都是相通的

在这里插入图片描述


rbegin和rend

rbegin函数可以得到容器中最后一个元素的反向迭代器,通过rend函数可以得到容器中第一个元素的前一个位置的反向迭代器

在这里插入图片描述

代码语言:javascript

AI代码解释

int main() { vector<int> v1; v1.push_back(5); v1.push_back(2); v1.push_back(0); vector<int>::reverse_iterator rit = v1.rbegin(); while (rit != v1.rend()) { cout << *rit << " "; ++rit; } return 0; }

运行结果如下:

在这里插入图片描述


3.空间的增长问题

size和capacity

通过size函数获取当前容器中的有效元素个数,通过capacity函数获取当前容器的最大容量。

代码语言:javascript

AI代码解释

#include<iostream> #include<vector> using namespace std; void test01() { vector<int> v1(6, 6); cout << "size:" << v1.size() << endl;//获取当前容器有效数据个数 cout << "capacity:" << v1.capacity() << endl;//获取当前容器最大容量 } int main() { test01(); return 0; }

运行结果如下:

在这里插入图片描述


reserve和reszie

函数

作用

规则

reserve

改变容器的 容量 (capacity)

1. 当所给值 > 当前 capacity 时,扩容到该值。2. 当所给值 ≤ 当前 capacity 时,不做任何操作。

resize

改变容器的 有效元素个数 (size)

1. 当所给值 > 当前 size 时,扩展 size 到该值,新增元素为指定值(默认 0)。2. 当所给值 < 当前 size 时,缩小 size 到该值,超出部分元素被移除。

代码语言:javascript

AI代码解释

#include<iostream> #include<vector> using namespace std; void test01() { vector<int> v1(6, 6); cout << "size: " << v1.size() << endl;//获取当前容器有效数据个数 6 cout << "capacity: " << v1.capacity() << endl;//获取当前容器最大容量 6 v1.reserve(20);//修改容器最大容量为20 cout << "size: " << v1.size() << endl;//6 cout << "capacity: " << v1.capacity() << endl;//20 v1.resize(10); cout << "size: " << v1.size() << endl;//10,剩余空间默认为0 cout << "capacity: " << v1.capacity() << endl;//10 v1.resize(15,8); cout << "size: " << v1.size() << endl;//15,剩余空间补8 cout << "capacity: " << v1.capacity() << endl;//15 } int main() { test01(); return 0; }

运行结果如下:

在这里插入图片描述


empty

通过empty函数判断当前容器是否为空。

代码语言:javascript

AI代码解释

#include<iostream> #include<vector> using namespace std; void test02() { vector<int> v2(6, 6); vector<int> v3; cout << "v2: " << v2.empty() << endl; cout << "v3: " << v3.empty() << endl; } int main() { test02(); return 0; }

运行结果如下:

在这里插入图片描述


4.vector增删查改

push_back和pop_back

通过push_back函数对容器进行尾插,pop_back函数对容器进行尾删。

代码语言:javascript

AI代码解释

#include<iostream> #include<vector> using namespace std; void test03() { vector<int> v1; v1.push_back(5); v1.push_back(2); v1.push_back(0); v1.push_back(1); v1.push_back(3); v1.push_back(1); v1.push_back(4); v1.pop_back(); v1.pop_back(); } int main() { //test01(); //test02(); test03(); return 0; }

代码运行如下:

在这里插入图片描述

在这里插入图片描述


insert和erase

通过insert函数可以在所给迭代器pos位置插入一个或多个元素,通过erase函数可以删除所给迭代器pos位置的元素,或删除所给迭代器区间内的所有元素(左闭右开)。

代码语言:javascript

AI代码解释

#include<iostream> #include<vector> using namespace std; void test04() { vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.insert(v.begin(), 0); //在容器开头插入0 v.insert(v.begin(), 5, -1); //在容器开头插入5个-1 v.erase(v.begin()); //删除容器中的第一个元素 v.erase(v.begin(), v.begin() + 5); //删除在该迭代器区间内的元素(左闭右开) return 0; } int main() { //test01(); //test02(); //test03(); test04(); return 0; }

运行结果如下:

在这里插入图片描述

在这里插入图片描述

以上是按位置进行插入或删除元素的方式,若要按值进行插入或删除(在某一特定值位置进行插入或删除),则需要用到find函数。 find函数: find函数共三个参数,前两个参数确定一个迭代器区间(左闭右开),第三个参数确定所要寻找的值。 find函数在所给迭代器区间寻找第一个匹配的元素,并返回它的迭代器,若未找到,则返回所给的第二个参数

http://www.jsqmd.com/news/477930/

相关文章:

  • Hibernate与JPA方言配置:跨数据库开发的统一接口
  • 分布式事务解决方案全景指南:2PC、TCC、SAGA 与 Seata 实战
  • 【Windows】Dify + Ollama/Xinference/GPUStack:一站式AI开发环境搭建指南
  • 硬件设计之电源反接防护:从基础二极管到高效MOS管的选型实战
  • 跨微服务的“数据孤岛”解法:利用声明式 API 构建去中心化的数据联邦
  • SecGPT-14B步骤详解:Chainlit前端对接vLLM服务全流程
  • 从零到精通:UNIX BENCH性能基准测试全流程实战
  • 深入解析HDMI中的EDID与E-EDID:从基础结构到实际应用
  • StructBERT中文句子相似度WebUI实战手册:Websocket实时结果推送实验
  • 01-SA8155P 冷启动EDL模式硬件配置与常见问题解析
  • 泰山派嵌入式Linux驱动开发基础入门篇
  • L2-006 数的遍历(递归经典 ,图论 )
  • Phi-3-Mini-128K部署优化:bfloat16 vs float16显存与推理速度实测对比
  • Qwen3-TTS问题解决:常见部署错误排查,快速搞定语音合成
  • DAMO-YOLO快速体验:开箱即用的赛博朋克AI视觉工具
  • 从零构建认知:数据库系统核心概念与演进脉络深度解析
  • C++与区块链智能合约
  • 全面解读 Databricks:从架构、引擎到优化策略
  • java零碎知识(更新中)
  • Xiaojie雷达之路---毫米波雷达实战解析---相位差在速度测量中的关键作用
  • 基于SGL8022W的MOSS环形触摸灯硬件设计
  • 3步解锁音乐自由:NCMconverter全功能解析与实战指南
  • re2
  • 3步实现空间信息解析:开源号码定位工具全流程指南
  • Llama-3.2V-11B-cot开源可部署价值:替代商业API的私有化视觉推理方案
  • 多维动态规划 技巧(精选答案)
  • 全球智能驾驶SoC市场规模与算力分层演进深度分析
  • MWC 2026 十大亮点:AI 统治全场,6G 抢跑,折叠屏成熟
  • 一键部署Qwen3-ASR-0.6B:支持中文方言的语音识别模型体验
  • 2026年商务办公复印纸深度测评:基于流畅性与环保性的五维实战对比 - 品牌推荐