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语言高效、简洁、快速和可移植性的传统。 …...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
