C++的vector类(一):vector类的常见操作
目录
前言
Vector类
遍历与初始化vector
vector的扩容机制
vector的对象操作
find与insert
对象数组
前言
string类中还有一些内容需要注意:
STL 的string类怎么啦?
C++面试中string类的一种正确写法
C++ STL string的Copy-On-Write技术
C++的std::string的“读时也拷贝”技术!
Vector类
vector文档:cplusplus.com/reference/vector/vector/
基本概念:vector是表示可变数组(针对int、double等,字符数组去用string)的序列容器
类原型:template <class T,class Alloc = allocator<T> >class vector
class Alloc = allocator<T>(内存池)采用系统提供的默认的就行
注意事项:[]、普通数组和at的区别在于[]利用断言检查不给改错机会,普通数组是抽查的给改错机会,at是异常捕获
以下几个表中的内容与string类中的内容相似,不再一一演示
| vector的定义 | |
| (constructor)构造函数声明 | 接口说明 |
| vector() (重点) | 无参构造 |
| vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
| vector (const vector& x); (重点) | 拷贝构造 |
| vector (InputIterator first, InputIterator last) | 使用迭代器进行初始化构造 |
| vector iterator的使用 | |
| iterator的使用 | 接口说明 |
| begin + end | 获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置 的iterator/const_iterator |
| rbegin + rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的 reverse_iterator |
| vector的增删改查 | |
| vector的增删改查 | 接口说明 |
| assign | 覆盖 |
| push_back | 尾插 |
| pop_back | 尾删 |
| find | 查找(不是vector的成员接口,使用时要包含algorithm头文件) |
| insert | 在指定位置前插入数据 |
| erase | 删除指定位置数据 |
| swap | 交换两个vector的数据空间 |
| clear | 清空数据 |
| operator[] | 像数组一样访问 |
遍历与初始化vector
#include <iostream>
#include <vector>
using namespace std;int main()
{//初始化vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);//vector<int>(10,1):开始个空间每个空间给个1//[]重载for (size_t i = 0; i < v.size(); i++){cout << v[i] << "";}cout << endl;//迭代器vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";it++;}cout << endl;//范围forfor (auto i : v){cout << i << " ";}cout << endl;return 0;
}

vector的扩容机制
1、扩容1.5倍然后取整
#include <iostream>
#include <vector>
using namespace std;void test_vector2()
{size_t sz;vector<int> v;sz = v.capacity();cout << "making v grow:\n";for (int i = 0; i < 100; i++){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity change:" << sz << endl;}}
}int main()
{test_vector2();return 0;
}

2、resize和reserve不会缩容,要缩容用shrink_to_fit
#include <iostream>
#include <vector>
using namespace std;void test_vector2()
{size_t sz;vector<int> v;sz = v.capacity();v.reserve(100);//提前开空间cout << "making v grow:\n";for (int i = 0; i < 100; i++){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity change:" << sz << endl;}}cout << "-----------------------" << endl;cout << "reserve尝试对原空间进行缩容 >" << endl;cout <<"原size >" << v.size() << endl;cout <<"原capacity >" << v.capacity() << endl;v.reserve(10);cout << "后size >" << v.size() << endl;cout << "后capacity >" << v.capacity() << endl;cout << "-----------------------" << endl;cout << "resize尝试对原空间进行缩容 >" << endl;cout << "原size >" << v.size() << endl;cout << "原capacity >" << v.capacity() << endl;v.resize(10);cout << "后size >" << v.size() << endl;cout << "后capacity >" << v.capacity() << endl;cout << "-----------------------" << endl;cout << "原size >" << v.size() << endl;cout << "原capacity >" << v.capacity() << endl;cout << "shrink_to_fit尝试对原空间进行缩容 >" << endl;v.shrink_to_fit();cout << "后size >" << v.size() << endl;cout << "后capacity >" << v.capacity() << endl;}int main()
{test_vector2();return 0;
}

vector的对象操作
find与insert
#include <iostream>
#include <vector>
#include<string>
#include <algorithm>
using namespace std;//增删改查
void test_vector3()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);cout << "初始化 >";for (auto e : v){cout << e << " ";}cout << endl;//找到数组中的3并返回该数据的下标auto pos = find(v.begin(), v.end(), 3);if (pos != v.end())//左闭右开才能遍历到数组所有的值{v.insert(pos,30);//在pos位置前插入30}cout << "在3前插入30后 >";for (auto e : v){cout << e << " ";}cout << endl;//头插v.insert(v.begin(), 0);cout << "头插0 >";for (auto e : v){cout << e << " ";}cout << endl;//在下标为2的位置插入v.insert(v.begin() + 2, 20);cout << "在下标为2的位置插入20 >";for (auto e : v){cout << e << " ";}cout << endl;string s("abcd");cout << "头插字符串 >";v.insert(v.begin(), s.begin(), s.end());for (auto e : v)//读取ASCII码{cout << e << " ";}cout << endl;}int main()
{test_vector3();return 0;
}

对象数组
push_back的原型:void push_back(const value_type& val)
- value_type:自适应类型
#include <iostream>
#include <vector>
#include<string>
#include <algorithm>
using namespace std;//对象数组
void test_vector4()
{//对象数组vector<string> v;//版本一:有名对象string s1("苹果");v.push_back(s1);//版本二:匿名对象v.push_back(string("香蕉"));//版本三:隐式类型转换->产生临时对象->将该临时对象传入->val就是string类型对象的引用//隐式类型转换:字符串->字符数组->调用std::string(const char*)构造临时std::string对象,并将该对象传递给函数v.push_back("草莓");//版本一二三效果相同for (auto e : v){cout << e << " ";}cout << endl;}int main()
{test_vector4();return 0;
}

在 Visual Studio 中使用
std::string,通常情况下,当字符串长度小于等于 28 字节时,std::string对象会将字符串内容存储在对象内部的小缓冲区中。这个小缓冲区被称为 "短字符串优化"。这样可以避免频繁地进行堆分配和释放。对于超过 28 字节的较长字符串,则会动态分配内存来存储其内容,且std::string对象本身仅保存指向堆上数据的指针。如果有一个包含多个较长字符串的对象数组,并且只关心它们是一个对象数组而不需要了解每个具体元素所在位置或大小细节,那么您可以声明一个
std::vector<std::string>来存储这些字符串。无论单个std::string的大小如何,在该向量中每个元素都将是一个完整的std:string对象。
vector是一个数组模板,除了有对象数组,还可以有链表数组、树数组、以及嵌套vector数组:
树数组:vector<tree> tc
链表数组:vector<list> lc
嵌套vector数组:vector<vector<int>> cc

- 外部vector的T是vector<int>*,内部vector的T是int*
- vector<int>*可以指向多个vector<int>,int*可以指向多个int
- 外部vector实例化出了对象数组,内部vector实例化出了整型数组
~over~
相关文章:
C++的vector类(一):vector类的常见操作
目录 前言 Vector类 遍历与初始化vector vector的扩容机制 vector的对象操作 find与insert 对象数组 前言 string类中还有一些内容需要注意: STL 的string类怎么啦? C面试中string类的一种正确写法 C STL string的Copy-On-Write技术 C的st…...
SpringBoot注解
Spring Boot 中常用的一些注解及其作用如下所示: SpringBootApplication:标注一个主程序类,用于启动 Spring Boot 应用,通常放在包的最顶层。 RestController:结合 Controller 和 ResponseBody,用于定义 R…...
每日三个JAVA经典面试题(十九)
1.Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势?Java并发API中的Lock接口提供了一种比传统synchronized块或方法更灵活、更强大的线程同步机制。Lock接口允许更细粒度的锁控制,通过它可以实现更复杂的线…...
springboot企业级抽奖项目业务一(登录模块)
开发流程 该业务基于rouyi生成好了mapper和service的代码,现在需要在controller层写接口 实际操作流程: 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口文档 在登录模块有登录和登出方…...
【Python + Django】启动简单的文本页面
前言: 为了应付(bushi)毕业论文,总要自己亲手搞一个像模像样的项目出来吧 ~ ~ 希望自己能在新的连载中学到项目搭建的知识,这也算是为自己的测试经历增添光彩吧!!! 希望、希望大家…...
Docker——问题解决:服务器端和Windows端IP互通
踩了大坑,特此记录!!!!! 我在服务器端部署了服务,但是在本地端Windows机器上无法访问,因此卡了一天。 1. 双向Ping通 防火墙导致只能单向Ping通 首先需要解决双向ping通的问题&…...
HTTP跨域
1. 简介 HTTP跨域是指不同域名下的网页请求资源时,由于浏览器同源策略限制,导致请求被阻止。为解决这一问题,开发者常采用跨域资源共享(CORS)等技术来允许合法跨域请求,确保网站功能正常运行。 同源 协议…...
用Python的turtle库绘制皮卡丘
turtle库的简介 turtle(海龟)库是turtle绘图体系的python实现,turtle库是一种标准库,是python自带的。 turtle(海龟)是一种真实的存在,有一个海龟在窗口的正中心,在画布上游走,走过的轨迹形成了绘制的图形࿰…...
C语言打印当前时间
#include <time.h> void print_current_time(char* func_name) { // 获取当前的时间 time_t current_time; time(¤t_time); // 将时间转换为本地时间格式 struct tm *local_time localtime(¤t_time); // 打印当前的时间 …...
(一)基于IDEA的JAVA基础4
注释文本,注释模版 单行注释://开头放在代码前面,对少部分。 多行注释:快捷方式ctrlshift/,对段落代码注 释。 文档注释:/**……**/,用于声明作者或创作时 间。 文档注释如何设置,首先找到File中…...
【Python】复习12:标准库与第三方库
目录 概念标准库第三方库总结Python 标准库`os` 模块`sys` 模块`json` 模块`re` 模块`datetime` 模块代码示例`os` 模块例子`sys` 模块例子`json` 模块例子`re` 模块例子`datetime` 模块例子第三方库`numpy``pandas``requests`安装第三方库使用第三方库其他一些流行的Python库数…...
CUDA 12介绍
CUDA(Compute Unified Device Architecture)是由 NVIDIA 开发的并行计算平台和应用程序编程接口(API)。CUDA 使开发人员能够使用 NVIDIA GPU 进行通用目的的并行计算。CUDA 通过利用 GPU 的大规模并行计算能力来加速各种类型的计算…...
旅游系统-软件与环境
运行 1.下载软件并进行环境配置 2.导入项目包以及SQL文件 (1)VsCode 管理员运行打开 a.新建terminal 注意: 1.执行 npm config set registry https://registry.npm.taobao.org 2.执行 npm install 3.执行 $env:NODE_OPTIONS“–openssl-legacy-provider” b.输入…...
AI基础知识(2)--决策树,神经网络
1.什么是决策树? 决策树是一类常见的机器学习方法,决策树是基于树的结构来进行决策。决策过程中提出的每一个问题都是对于属性的“测试”,决策的最终结论对应了我们希望的判定结果。一个决策树包含一个根节点,若干个内部节点和若…...
蓝桥杯C++大学B组一个月冲刺记录2024/3/21
蓝桥杯C大学B组一个月冲刺记录2024/3/20 规则:每日三题 今日的题很简单┗|`O′|┛ 嗷~~ 1.奶酪 现有一块大奶酪,它的高度为 h ,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。 我们可以在…...
由浅到深认识C语言(14):枚举
该文章Github地址:https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn…...
速盾cdn:cdn节点缓存内容不一致怎么办?
在使用CDN服务时,有时候可能会遇到CDN节点缓存内容不一致的情况。这种情况会导致用户访问网站时获取到的内容不一致,给用户带来困惑和不良体验。那么当遇到这种情况时,我们应该如何解决呢? 首先,我们需要了解CDN是如何…...
【LAMMPS学习】三、构建LAMMPS(6)在构建中包含软件包
3. 构建 LAMMPS 3.6.在构建中包含软件包 在 LAMMPS 中,包是一组启用一组特定功能的文件。例如,分子系统的力场或刚体约束都在封装中。在 src 目录中,每个包都是一个子目录,包名称为大写字母。 包文档页面上给出了包的概述。每…...
apache commons-dbcp Apache Commons DBCP 软件实现数据库连接池 commons-dbcp2
DBCP组件 许多Apache项目支持与关系型数据库进行交互。为每个用户创建一个新连接可能很耗时(通常需要多秒钟的时钟时间),以执行可能需要毫秒级时间的数据库事务。对于一个公开托管在互联网上的应用程序,在同时在线用户数量可能非…...
8.2K star!史上最强Web应用防火墙
🚩 0x01 介绍 长亭雷池SafeLine是长亭科技耗时近 10 年倾情打造的WAF(Web Application Firewall),一款敢打出口号 “不让黑客越雷池一步” 的 WAF,我愿称之为史上最强的一款Web应用防火墙,足够简单、足够好用、足够强的免费且开源…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

