《吃透 C++ vector:从基础使用到核心接口实战指南》 - 指南

news/2025/10/3 14:48:23/文章来源:https://www.cnblogs.com/yxysuanfa/p/19124610

草莓熊Lotso:个人主页

❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》

生活是默默的坚持,毅力是永久的享受。


博主简介:


目录

前言:

一. vector是什么?一段话搞懂核心定位

二. vector核心接口:必学的几个高频操作

2.1 定义和初始化(构造函数)

2.2 迭代器:遍历 vector 的 "万能工具"

2.3 空间管理:size、capacity 与扩容策略

2.4 增删查改:日常开发高频操作

三. vector 实战:OJ 算法题中的高频用法

3.1 只出现一次的数字

3.2 杨辉三角

结尾:


前言:

在 C++ STL 容器中,vector 是最常用、最灵活的动态数组容器,既能像普通数组一样高效访问元素,又能自动扩容适配数据量变化。无论是日常开发还是算法刷题(OJ 场景,vector 都是高频工具。本文将从 “能用” 到 “会用”,系统讲解 vector 的核心接口、使用技巧与避坑要点,帮你彻底掌握这个 “万能容器”。


一. vector是什么?一段话搞懂核心定位

vector 本质是动态大小的数组,底层通过连续内存存储元素,支持:

  • 随机访问(像数组一样用[ ]访问,时间复杂度为 O(1)))。
  • 自动扩容(元素超过容量时,自动分配更大内存并转移数据)。
  • 灵活增删(尾插,尾删高效,中间插入/删除需移动元素)。

简单说:vector综合了普通数组的便捷性+动态扩容的灵活性。


二. vector核心接口:必学的几个高频操作

  • 我们有了前面学习 string 的基础,再来学习 vector 就轻松很多了,而且也不需要记住所有接口,重点掌握 “定义、迭代器、空间管理、增删查改” 四大类核心接口,即可覆盖 90% 以上场景。

--由于vector没有重置流插入流提取,所以我们这里自己实现一个打印,其实这里的遍历打印操作是跟string差不多的,直接看代码就行。

void Print(const vector& v)
{//1.下标for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;//2.范围for//for (auto e : v)//{//	cout << e << " ";//}//cout << endl;//3.迭代器//vector::const_iterator it = v.begin();//while (it != v.end())//{//	cout << *it << " ";//	it++;//}//cout << endl;
}

2.1 定义和初始化(构造函数)

vector 提供了4种常用构造方式,我们可以根据不同场景来选择

构造函数声明接口说明代码示例
vector()(重点)无参构造,创建空 vectorvector<int> v;(空容器,size=0,capacity=0)
vector(size_type n, val)构造并初始化 n 个 valvector<int> v(5, 3);(含 5 个 3,size=5,capacity=5)
vector(const vector& x)(重点)拷贝构造,复制另一个 vectorvector<int> v2(v1);(v2 是 v1 的副本)
vector(iterator first, iterator last)迭代器初始化,复制区间元素vector<int> v(a, a+5);(复制数组 a [0]~a [4])

--这里补充了一个C++11之后的方式,下面的代码里面会有

代码演示:

void test_vector1()
{vector v1;vector v2(10,1);vector v3(v2.begin(),v2.end());string s1("xxxxxxxxxxxxxxxxxxxxxxxxxx");//用其它类型的迭代器,这两个类型必须要可以转换vector v4(s1.begin(), s1.end());vector v5(v3);//C++11//vector v6({ 1,2,3,4,5 });vector v6 = { 1,2,3,4,5 };vector v7={ 1,2,3,4,5,1,1,1,1,1};//其实是这样auto il = { 10,20,30,1,2,2 };for (auto e : il){cout << e << " ";}cout << endl;Print(v2);Print(v4);Print(v6);Print(v7);
}
int main()
{test_vector1();
}

2.2 迭代器:遍历 vector 的 "万能工具"

  • 迭代器是访问容器元素的通用接口,vector 的迭代器本质是 “封装的指针”,支持遍历、取值、移动等操作。

核心迭代器接口如下:

迭代器接口接口说明代码示例(遍历 vector)
begin()获取第一个元素的迭代器auto it = v.begin();(指向 v [0])
end()获取最后一个元素下一位的迭代器while (it != v.end()) { ... }
rbegin()获取最后一个元素的反向迭代器auto rit = v.rbegin();(指向 v [size-1])
rend()获取第一个元素前一位的反向迭代器while (rit != v.rend()) { ... }

--下标访问下面也会演示,其实就是上面展示过的那个Print函数

代码演示:

void Print(const vector& v)
{for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;//for (auto e : v)//{//	cout << e << " ";//}//cout << endl;//vector::const_iterator it = v.begin();//while (it != v.end())//{//	cout << *it << " ";//	it++;//}//cout << endl;
}

2.3 空间管理:size、capacity 与扩容策略

  • vector 的 “空间” 分为 size(有效元素个数)和 capacity(最大可容纳元素个数,不含结束标志),理解两者区别是避免扩容开销的关键。

核心空间接口:

空间接口接口说明代码示例
size()获取有效元素个数cout << v.size();(v 有 5 个元素则输出 5)
capacity()获取容量大小cout << v.capacity();(容量可能大于 size)
empty()判断是否为空(size==0)if (v.empty()) { ... }
reserve(n)(重点)扩容到 n(仅开辟空间,不初始化)v.reserve(100);(提前扩容到 100,避免后续多次扩容)
resize(n, val)(重点)调整 size 到 n(缺省用 0 填充)v.resize(5, 2);(size=5,不足则补 2,超出则截断)

关键:vector 扩容策略

vector 扩容时会分配新内存迁移旧元素释放旧内存,这个过程耗时较高。不同编译器扩容倍数不同:

  • VS :1.5 倍扩容(如 capacity 从 4→6→9→13...);
  • G++ :2 倍扩容(如 capacity 从 4→8→16→32...)。

避坑建议:若已知元素个数,提前用 reserve(n) 扩容,避免边插入边扩容的效率损耗。

示例:

void test_vector2()
{vector v1;//const int n=10000000;const int n = 100;//v1.reserve(n);size_t old = v1.capacity();//cout << v1.capacity() << endl;size_t begin = clock();for (size_t i = 0; i < n; i++){v1.push_back(i);/*if (old != v1.capacity()){cout << v1.capacity() << endl;old = v1.capacity();}*/}size_t end = clock();cout << end - begin << endl;vector v2;v2.resize(100, 1);Print(v2);
}
int main()
{//test_vector1();test_vector2();
}

2.4 增删查改:日常开发高频操作

  • vector 的增删查改接口设计简洁,重点关注 “尾插 / 尾删” 的高效性和 “中间插入 / 删除” 的注意事项。
增删查改接口接口说明代码示例时间复杂度
push_back(val)(重点)尾插元素 valv.push_back(5);O (1)(无扩容时)/ O (n)(需扩容时)
pop_back()(重点)尾删最后一个元素v.pop_back();O (1)(仅修改 size,不释放空间)
insert(pos, val)在 pos 迭代器前插入 valv.insert(v.begin()+2, 6);O (n)(需移动 pos 后元素)
erase(pos)删除 pos 迭代器指向的元素v.erase(v.begin()+1);O (n)(需移动 pos 后元素)

--还要emplace_back等这些,下面演示会有,先了解即可,后面再讲

代码演示:

void test_vector3()
{vector v1 = { 1,2,3,4,5 };v1.push_back(6);Print(v1);v1.insert(v1.begin(), 0);Print(v1);v1.insert(v1.begin() + 3, 0);Print(v1);v1.erase(v1.begin());Print(v1);v1.erase(v1.begin() + 3);Print(v1);
}
//template 
//class vector
//{
//private:
//	T* _a;
//	size_t _size;
//	size_t _capacity;
//};
struct AA
{int _a1 = 1;int _a2 = 1;AA(int a1 = 1, int a2 = 1):_a1(a1),_a2(a2){ }
};
void test_vector4()
{AA aa1 = { 0,0 };vector v = { aa1,{1,1},{2,2},{3,3} };auto it = v.begin();while (it != v.end()){cout << it->_a1 << ":" << it->_a2 << endl;++it;}cout << endl;v.push_back(aa1);v.emplace_back(aa1);//推荐这样用//但是这两种交替不行v.emplace_back(1, 1);v.push_back({ 2,2 });it = v.begin();while (it != v.end()){cout << it->_a1 << ":" << it->_a2 << endl;++it;}cout << endl;
}
int main()
{//test_vector1();//test_vector2();test_vector3();test_vector4();
}


三. vector 实战:OJ 算法题中的高频用法

  • vector  是算法刷题的 “主力容器”,以下 3 道经典 OJ 题,覆盖 vector 的核心使用场景。

3.1 只出现一次的数字

题目链接:

136. 只出现一次的数字 - 力扣(LeetCode)

题目描述:

题目示例:

C++算法代码:

class Solution {
public:int singleNumber(vector& nums) {int ret=0;for(auto a:nums){ret^=a;}return ret;}
};

3.2 杨辉三角

题目链接:

118. 杨辉三角 - 力扣(LeetCode)

题目描述:        

题目示例:

C++算法代码:

class Solution {
public:vector> generate(int numRows) {vector> vv;//行vv.resize(numRows,vector());//列for(size_t n=0;n

结尾:

往期回顾:

C++ string 类使用超全攻略:从入门到高效避坑,日常开发直接使用_c语言怎么使用string输入字符串-CSDN博客

《告别 “会用不会讲”:C++ string 底层原理拆解 + 手撕实现,面试 / 开发都适用》-CSDN博客

结语:掌握这些核心知识点,vector 就能成为你开发和刷题中的 “万能工具”,既高效又可靠。

建议结合实际代码练习,尤其是迭代器失效和二维 vector 的使用,彻底吃透这个 STL 核心容器。

✨把这些内容吃透超牛的!放松下吧✨
ʕ˘ᴥ˘ʔ
づきらど

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广州旅游网站建设设计学做投资网站好

DevExpress ASP. NET Scheduler组件能完全复制Microsoft Outlook Scheduler的样式和功能&#xff0c;具有日、周、月和时间轴视图&#xff0c;并包括内置的打印支持&#xff0c;因此用户可以在尽可能短的时间内交付全功能的个人信息管理系统。在上文中&#xff08;点击这里回顾…

完整教程:GitOps:一种实现云原生的持续交付模型

完整教程:GitOps:一种实现云原生的持续交付模型pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

黑马程序员苍穹外卖学习指南(本文消除我跟视频做该项目时遇到的问题和解决方法)

黑马程序员苍穹外卖学习指南(本文消除我跟视频做该项目时遇到的问题和解决方法)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

做网站的个人心得学校网站模版

基于蚁群算法的TSP问题建模求解 一、蚁群优化算法&#xff08;Ant Colony Optimization&#xff0c;ACO&#xff09;1.1 蚁群算法的起源——“双桥实验”1.2 蚁群优化算法思想1.3 蚁群算法应用于求解组合优化问题 二、基于蚁群算法的TSP问题建模求解2.1 旅行商问题&#xff08;…

佛山网站建设百家号网站统计平台

使用Selenium处理动态生成的网页内容和语法代码可以通过以下步骤进行&#xff1a; 安装Selenium库&#xff1a;使用pip命令安装Selenium库&#xff0c;可以在命令行中运行如下命令&#xff1a; pip install selenium 下载WebDriver&#xff1a;Selenium需要与特定的浏览器进行交…

P11983 [JOIST 2025] 展览会 3 题解

Description JOI 美术馆计划近期举办一场绘画展览。馆方拥有编号为 \(1\) 至 \(N\) 的 \(N\) 幅画作,其中画作 \(i\)(\(1 \leq i \leq N\))的美观值为 \(A_i\)。在展览中这些画作将排成一行展示,但具体排列顺序尚未…

黑客马拉松(Hackathon)

黑客马拉松(Hackathon)黑客马拉松是一种 短时间内高强度的软件/硬件开发活动。一般持续 24~72 小时,有的甚至一周。参与者通常是开发者、设计师、产品经理等,组成小团队。目标是在有限时间里,从零开始,开发出一个…

详细介绍:Quarkus深度解析:响应式编程与Native镜像,如何重构Java云原生应用?

详细介绍:Quarkus深度解析:响应式编程与Native镜像,如何重构Java云原生应用?2025-10-03 14:29 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overfl…

节能网站源码深圳外贸业务员工资

void SaveBitmapToFile(HBITMAP hBitmap, char* szfilename) {HDC hdc; //设备描述表int ibits;WORD wbitcount; //当前显示分辨率下每个像素所占字节数//位图中每个像素所占字节数&#xff0c;定义调色板大小&#xff0c;位图中像素字节大小&#xff0c;位图文件大小 &a…

网络流 费用流 EK算法

模板题:洛谷p3381 #include<bits/stdc++.h> using namespace std; const int N=5e3+10,M=5e4+10,INF=0x3f3f3f3f; typedef long long LL; int n,m,s,t,id=1; int e[M<<1],h[N],cap[M<<1],d[M<&l…

“AI元人文”构想说明:构建智能时代的人文学科新范式

“AI元人文”构想说明:构建智能时代的人文学科新范式 一、 构想缘起与问题意识 我们正处在一个由人工智能技术驱动的历史性转折点。AI不仅重塑着我们的物质世界,更深刻地介入并挑战着人类对语言、文化、历史、伦理和…

双向LSTM-Attention模型

为了让你彻底理解双向LSTM-Attention模型的每一步,我们会在原有运转流程的基础上,对每个核心概念做“定义+通俗解释+模型中作用+项目实例”的四层拆解,从最基础的“时序窗口”到复杂的“注意力权重计算”,每个概念…

tomcat的功能和作用 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:【论文阅读 | ECCV 2024 | DAMSDet:具有竞争性查询选择与自适应特征融合的动态自适应多光谱检测变换器】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

手机网站开发 pdf网页特效源码网站

来源&#xff1a;软件定义世界&#xff08;SDX&#xff09;作者&#xff1a;吴甘沙、张玉新摘要&#xff1a;当卡尔 本茨发明汽车&#xff0c;人类进入汽车时代时&#xff0c;科学技术就对人类的 “ 出行 ” 进行了新的定义&#xff0c;而随着技术的不断发展与进步&#xff0c…

Xilinx高性能NVMe Host控制器IP+PCIe 3.0软核控制器IP,4通道DMA,1通道IO,纯逻辑实现,AXI4和AXI4-Stream DMA接口,支持PCIe 3.0和4.0

NVMe AXI4 Host Controller IP可以连接高速存储PCIe SSD,无需CPU,自动加速处理所有的NVMe协议命令,具备独立的数据写入和读取AXI4接口,不但适用高性能、顺序访问的应用,也适用于随机访问的应用,同时结合外部存储…

巫山网站开发制作网站付费软件

来源&#xff1a;网络大数据摘要&#xff1a;尽管科幻小说可能将人工智能机器人描绘成坏人&#xff0c;但一些科技巨头现在也将其用于安全。 微软和优步等公司使用Knightscope K5机器人巡逻停车场和大型户外区域来预测和预防犯罪。 机器人可以读取车牌&#xff0c;报告可疑活动…

做网站显示上次登录时间代码网站的基本要素

构建进化树的需求 在生物生态学领域&#xff0c;构建进化树&#xff08;也称为系统发生树或谱系树&#xff09;具有以下几个重要的目的和需求&#xff1a; 理解物种间的亲缘关系&#xff1a; 进化树揭示了物种之间的演化关系和共同祖先&#xff0c;帮助科学家理解不同物种是如…

公私合作抗击网络威胁的创新实践

本文探讨了公共部门与私营企业如何通过合作应对网络安全威胁,分析了合作模式、创新解决方案及当前面临的挑战,特别是在疫情期间远程工作环境下的安全防护问题。公私合作如何共同抗击网络威胁 TF7电台访谈强调合作重要…