C++ vector的基本使用(待补全)

std::vector 是C++标准模板库(STL)中的一个非常重要的容器类,它提供了一种动态数组的功能。能够存储相同类型的元素序列,并且可以自动管理存储空间的大小,以适应序列大小变化,处理元素集合的时候很灵活
1. vector的定义
| 构造函数声明 | 接口说明 |
| vector(); | 无参构造 |
| vector( size_t n, const value_type& val = value_type()); | 构造并初始化n个val |
| vector(const vector& x); | 拷贝构造 |
| vector(InputIterator first, InputIterator last); | 使用迭代器进行初始化构造 |
代码如下
#include<iostream>
#include<vector>
//using namespace std;
using std::vector;
using namespace std;
int main()
{vector<int> v1;for (size_t i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;vector<int> v2(10);vector<int> v3(10, 6);for (size_t i = 0; i < v2.size(); i++){cout << v2[i] << "," << v3[i] << " ";}cout << endl;vector<int> v4(v2);for (size_t i = 0; i < v4.size(); i++){cout << v4[i] << " ";}cout << endl;vector<int> v5(v3.begin(), v3.begin() + 2);for (size_t i = 0; i < v5.size(); i++){cout << v5[i] << " ";}cout << endl;
}
其中v1是无参默认构造, v2是利用了缺省值全初始化为0,v3是初始化n个 6,v4是用v2进行拷贝构造,v5则是利用迭代器进行构造
输出结果如下

2. 迭代器iterator的使用
| iterator的使用 | 接口说明 |
| begin+end | 获取第一个位置数据的iterator/const_iterator,获取最后一个数据的下一个位置的iterator/const_iterator |
| rbegin+rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator |
如下图所示

使用代码如下
#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{vector<int> v(10,6);v.push_back(1);//vector<int>::iterator it = v.begin();auto it = v.begin();while (it != v.end()){cout << *it << " ";it++;}cout << endl;vector<int>::reverse_iterator iv = v.rbegin();while (iv != v.rend()){cout << *iv << " ";iv++;}cout << endl;
}
输出结果如下

使用iterator不可以vector::iterator it = v.begin(); 因为vector是一个模板类需要指定其存储元素的类型。直接写没指定vector具体类型,编译器不知道就会报错(比如可能是vector<double>,vector<int>等)。当然也可以直接用auto自动识别。
3. vector空间增长问题
| 成员函数 | 接口说明 |
| size | 获取数据个数 |
| capacity | 获取容量大小 |
| empty | 判断是否为空 |
| resize | 改变vector的元素个数(size) |
| reserve | 改变vector的容量(capacity) |
(1). size与capacity
用以下代码验证vector动态增长
#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{vector<int> v;size_t sz = v.capacity();cout << "容量为:" << sz << endl;cout << "元素个数:" << v.size() << endl;for (int i = 0; i < 100; i++){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "当前容量:" << sz << endl;cout << "当前元素个数:" << v.size() << endl;}}
}
输出结果为下图

通过上图我们不难发现,在vs中运行每次增长1.5倍,向上取整
而g++下运行每次增长2倍,并不是所有的vector增容都是增长1.5倍或2倍的。具体增长是多少是看具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
(2). empty与resize与reserve
reserve只负责开辟空间,如果确定要用多少空间,reserve可以缓解vector增容的代价缺陷问题。只影响capacity(),不影响size()
resize在开空间时还会进行初始化,会影响capacity()还会影响size()
如以下代码
#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{vector<int> v1;size_t sz = v1.capacity();cout << "v1容量为:" << sz << endl;cout << "v1元素个数:" << v1.size() << endl;if(v1.empty()){v1.reserve(100);}for (int i = 0; i < 100; i++){v1.push_back(i);if (sz != v1.capacity()){sz = v1.capacity();cout << "v1当前容量:" << sz << endl;cout << "v1当前元素个数:" << v1.size() << endl;}}vector<int> v2;cout << "v2容量为:" << v2.capacity() << endl;cout << "v2元素个数:" << v2.size() << endl;v2.resize(10);cout << "v2当前容量为:" << v2.capacity() << endl;cout << "v2当前元素个数为:" << v2.size() << endl;for (int i = 0; i < v2.size(); i++){cout << v2[i] << " ";}cout << endl;vector<int> v3;cout << "v3容量为:" << v3.capacity() << endl;cout << "v3元素个数:" << v3.size() << endl;v3.resize(10, 3);cout << "v3当前容量为:" << v3.capacity() << endl;cout << "v3当前元素个数为:" << v3.size() << endl;for (int i = 0; i < v3.size(); i++){cout << v3[i] << " ";}cout << endl;
}
输出结果为下图所示

可以验证我们以上说法
4. vector的增删查改
| vector的元素操作 | 接口说明 |
| push_back | 尾插 |
| pop_back | 尾删 |
| find | 查找(算法模块实现,不是vector成员接口) |
| insert | 在position(指定坐标)之前插入val |
| erase | 删除position(指定坐标)位置的数据 |
| swap | 交换两个vector的数据空间 |
| operator[] | 重载运算符,使其能像数组一样访问 |
//#include<iostream>
//#include<vector>
using namespace std;
//using std::vector;
//using namespace std;
//int main()
//{
// vector<int> v1;
// for (size_t i = 0; i < v1.size(); i++)
// {
// cout << v1[i] << " ";
// }
// cout << endl;
// vector<int> v2(10);
// vector<int> v3(10, 6);
// for (size_t i = 0; i < v2.size(); i++)
// {
// cout << v2[i] << "," << v3[i] << " ";
// }
// cout << endl;
// vector<int> v4(v2);
// for (size_t i = 0; i < v4.size(); i++)
// {
// cout << v4[i] << " ";
// }
// cout << endl;
//
// vector<int> v5(v3.begin(), v3.begin() + 2);
// for (size_t i = 0; i < v5.size(); i++)
// {
// cout << v5[i] << " ";
// }
// cout << endl;
//}
//#include<iostream>
//#include<vector>
using namespace std;
//using namespace std;
//int main()
//{
// vector<int> v(10,6);
// v.push_back(1);
// //vector<int>::iterator it = v.begin();
// auto it = v.begin();
// while (it != v.end())
// {
// cout << *it << " ";
// it++;
// }
// cout << endl;
// vector<int>::reverse_iterator iv = v.rbegin();
// while (iv != v.rend())
// {
// cout << *iv << " ";
// iv++;
// }
// cout << endl;
//}
//#include<iostream>
//#include<vector>
using namespace std;
//using namespace std;
//int main()
//{
// vector<int> v;
// size_t sz = v.capacity();
// cout << "容量为:" << sz << endl;
// cout << "元素个数:" << v.size() << endl;
// for (int i = 0; i < 100; i++)
// {
// v.push_back(i);
// if (sz != v.capacity())
// {
// sz = v.capacity();
// cout << "当前容量:" << sz << endl;
// cout << "当前元素个数:" << v.size() << endl;
// }
// }
//}
#include<iostream>
#include<vector>
//using namespace std;
using namespace std;
int main()
{
vector<int> v1;
size_t sz = v1.capacity();
cout << "v1容量为:" << sz << endl;
cout << "v1元素个数:" << v1.size() << endl;
if(v1.empty())
{
v1.reserve(100);
}
for (int i = 0; i < 100; i++)
{
v1.push_back(i);
if (sz != v1.capacity())
{
sz = v1.capacity();
cout << "v1当前容量:" << sz << endl;
cout << "v1当前元素个数:" << v1.size() << endl;
}
}
vector<int> v2;
cout << "v2容量为:" << v2.capacity() << endl;
cout << "v2元素个数:" << v2.size() << endl;
v2.resize(10);
cout << "v2当前容量为:" << v2.capacity() << endl;
cout << "v2当前元素个数为:" << v2.size() << endl;
for (int i = 0; i < v2.size(); i++)
{
cout << v2[i] << " ";
}
cout << endl;
vector<int> v3;
cout << "v3容量为:" << v3.capacity() << endl;
cout << "v3元素个数:" << v3.size() << endl;
v3.resize(10, 3);
cout << "v3当前容量为:" << v3.capacity() << endl;
cout << "v3当前元素个数为:" << v3.size() << endl;
for (int i = 0; i < v3.size(); i++)
{
cout << v3[i] << " ";
}
cout << endl;
}
相关文章:
C++ vector的基本使用(待补全)
std::vector 是C标准模板库(STL)中的一个非常重要的容器类,它提供了一种动态数组的功能。能够存储相同类型的元素序列,并且可以自动管理存储空间的大小,以适应序列大小变化,处理元素集合的时候很灵活 1. vector的定义 构造函数声…...
Java 属性拷贝 三种实现方式
第一种 List<OrederPayCustomer> orederPayCustomerList this.list(queryWrapper); List<CustomerResp>customerRespListnew ArrayList<>();for (OrederPayCustomer orederPayCustomer : orederPayCustomerList) {CustomerResp customerResp new Custome…...
Java-变量,运算符,输入与输出
目录 一,语法基础 1.基本Java程序 2.语法基础 2.1 变量 2.2 常量限制(fiinal)类比C中的const 2.3 类型转化 2.4 运算符 2.5 表达式 2.5 输入与输出 2.5.1 输入 2.5.2 输出 一,语法基础 1.基本Java程序 public class Main{public static void…...
五、一个quad同时支持pcie和sfp两种高速接口的ref时钟配置
项目描述 上位机将截图数据通过 XDMA 写入到 FPGA 侧的 DDR 内存区域 1 中通过 axi_lite 接口给 axi_read_start 信号,通知 AXI_read 模块启动读取数据,然后通过 GTP TX 模块发送出去。经过光纤回环,GTP RX 端接收到数据,送给 AX…...
AI辅助教育:九章大模型的数学辅导功能解析
1.简介 九章大模型是学而思为学习研发的模型,该模型对于数学做了很多专门的训练,在题目推荐方面做得比较好。 同时,这个模型也能支持上传图片,对图片内容进行分析,然后针对内容进行校对,推荐相识题目。 支…...
力扣刷题之3128.直角三角形
题干描述 给你一个二维 boolean 矩阵 grid 。 请你返回使用 grid 中的 3 个元素可以构建的 直角三角形 数目,且满足 3 个元素值 都 为 1 。 注意: 如果 grid 中 3 个元素满足:一个元素与另一个元素在 同一行,同时与第三个元素…...
OD C卷 - 机场航班调度
机场航班调度(100) 航班组成:前两个大写字母代表航空公司缩写,后面4个数字代表航班信息;对输入的航班排序 首先按照航空公司缩写升序排序;同一航空公司的按照航班信息升序排序; 输入描述&…...
uni-app中使用支付宝扫码插件并且在真机调试时使用(详细教程)
前言:uni-app自带的扫码api 识别不灵敏,每次都得扫很长时间且不断调整才能扫出来码,所以决定使用支付宝扫码插件,官方插件地址:https://ext.dcloud.net.cn/plugin?id2636#detail 使用步骤: 1、下载插件到项目中 2、…...
每日学术速递8.5—1
1.SV4D: Dynamic 3D Content Generation with Multi-Frame and Multi-View Consistency 标题: SV4D:具有多帧和多视图一致性的动态 3D 内容生成 作者:Yiming Xie, Chun-Han Yao, Vikram Voleti, Huaizu Jiang, Varun Jampani 文章链接&…...
1、操作系统相关概念
1、操作系统是计算机上的第一层软件,用于管理计算机硬件设备,提高他们的利用率和通吐量,并为用户和应用程序提供一个接口。不同操作系统目标不同,查询设备的操作系统,侧重人机交互性;武器控制操作系统&…...
【ModelSim】仿真问题记录
1、波形出不全: 1、甚至连clk波形都出不来 2、个别波形只有到仿真结束的时候才出现 解决办法: 1、添加波形需要是实例中的net 2、排查是否存在声明与示例的位宽不一致的信号 3、观察是否存在未初始化的变量寄存器 4、缩短整个仿真的步长 2、Instance列…...
如何提高深度学习中数据运行的稳定性
在深度学习中,模型的训练通常会受到随机性因素的影响,如参数初始化、数据加载顺序等。这会导致每次训练得到的结果有所不同。要减少这种不稳定性,可以采取以下措施: 1.固定随机种子 通过设置随机种子,可以使得每次训…...
【连续数组】python刷题记录
R3-前缀和专题 绝对要用字典记录 ben神,前缀和字典 class Solution:def findMaxLength(self, nums: List[int]) -> int:#前缀和字典,key为差值,value为坐标dict{0:-1}#当前1和0的差值counter0ret0for i,num in enumerate(nums):#多1+1if…...
JavaScript青少年简明教程:DOM和CSS简介
JavaScript青少年简明教程:DOM和CSS简介 DOM简介 DOM(Document Object Model)将文档表示为一个树形结构,其中每个节点都是一个对象,每个对象都有其自身的属性和方法。 通过对DOM的操作,开发者可以使用编…...
架构师知识梳理(一):计算机硬件
目录 计算机硬件组成 CPU CPU的组成 CPU的功能 校验码 奇偶校验 CRC CRC计算案例 指令 指令指行过程 指令系统 指令系统分类 指令流水线技术 流水线技术相关计算公式 存储 计算机存储系统设计 高速缓存Cache 缓存的局部性原理 地址映射 替换算法 关于命中…...
从根儿上学习spring 四 之run方法启动第一段
图1 由上图我们可以看到,我把run方法分成了5个小段,每小段使用红框圈了起来,这一篇我们先开始讲第一段。大家需要关注下行号,我讲的时候可能会使用行号对应具体某行代码。 图1-289-290行: 没啥好说的定义了两个变量&…...
智能闹钟如何判断用户已经醒了?
智能闹钟判断用户是否已经醒来的方式主要依赖于其内置的传感器和算法系统。以下是一些常见的判断方法: 一、传感器监测 体动传感器:智能闹钟通常配备有体动传感器,用于监测用户的身体运动。当用户从睡眠状态转变为清醒状态,并开始…...
【算法】动态规划解决背包问题
应用场景——01背包问题 有一个背包,背包的容量为 4,现有如下物品 要求 1.目标为装入背包的总价值最大,并且重量不超出 2.要求装入的物品不能重复 动态规划算法介绍 1.动态规划算法的核心是:将大问题划分为小问题进行解决&…...
day09 工作日报表
日期 30日07月2024年 任务安排 今天主要就是讲了security类工作的原理,然后就是让我们自己做项目 工作中的问题 今天做项目的时候发现有时候用postman测试返回20001,说错误见控制台,但是控制台一片祥和,于是就尝试用tr…...
C++学习之路(1)— 第一个HelloWorld程序
C学习之路(1)— 第一个HelloWorld程序 一、前言 C在C语言的基础上添加了对面向对象编程和泛型编程的支持,在 20世纪90年代便是最重要的编程语言之一,并在21世纪仍保持强劲势头。C继承了C语言高效、简洁、快速和可移植性的传统。 …...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
