【C++】STL容器——vector类的使用指南(含代码演示)(11)
前言
大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
目录
- 一、vector类——基本介绍
- 二、vector类——使用环境准备
- 三、vector类——文档查看
- 四、vector构造&初始化
- 【1】四种构造方式总结
- 【2】四种构造方式 [代码演示]
- [ 1 ] 无参构造
- [ 2 ] 构造并初始化n个val
- [ 3 ] 拷贝构造
- [ 4 ] 利用(两种)迭代器区间初始化
- 一、相关iterator
- 二、用其它类型初始化出现的问题
- 三、利用指针初始化
- 五、vector的访问及遍历操作
- [ 1 ] find
- [ 2 ] operator[ ]
- [ 3 ] vector的 访问及遍历操作 [代码演示]——迭代器
- 六、vector 增删查改
- [1] 尾插&尾删
- [3] 头插——insert
- [4] 清除——erase
- [4-PLUS] 清除特定位置——erase + find函数
- (1)find函数
- (2)代码演示
- 七、vector 空间相关函数
- 【1】空间相关函数总结
- 【2】size&capacity [代码演示]
- 【3】empty [代码演示]
- 【4】reserve&resize使用 [代码演示]
一、vector类——基本介绍
- vector是表示 可变大小数组 的序列容器。
- 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以 采用下标 对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以 动态改变的,而且它的大小会被容器自动处理。
- 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是:分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
- vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
- 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。
二、vector类——使用环境准备
- 在使用string类时,必须包含
#include<vector> #include<iostream>
以及 展开命名空间using namespace std;
三、vector类——文档查看
- 查看所有接口网站:https://cplusplus.com
四、vector构造&初始化
【1】四种构造方式总结
构造函数声明 | 功能说明 |
---|---|
vector()(重点) | 无参构造 |
vector(size_type n, const value_type& val = value_type()) (缺省) | 构造并初始化n个val |
vector (const vector& x); (重点) | 拷贝构造 |
vector (InputIterator first, InputIterator last); | 使用迭代器进行初始化构造 (这里用的迭代器不一定是vector的,可以给其他类型的迭代器) |
【2】四种构造方式 [代码演示]
[ 1 ] 无参构造
vector<int> v1();
[ 2 ] 构造并初始化n个val
//构造并初始化n个val(value可以是整型,string等等)
//< >内是val类型vector<int> v1(10, 1); vector<string> v2(10, "***");for (auto e : v1){cout << e << " ";}cout << endl;
[ 3 ] 拷贝构造
vector<int> v1(10, 1);
vector<int> v2(v1)
[ 4 ] 利用(两种)迭代器区间初始化
一、相关iterator
- 此处,大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点
【注意点】
- begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
- rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动
iterator的使用 | 接口说明 |
---|---|
begin +end(重点) | 获取第一个数据位置的iterator/const_iterator, 获取最后一数据的下一个位置的iterator/const_iterator |
rbegin + rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterat |
// 自己类型的迭代器,同是intvector<int> v1(10, 1); vector<int> v3(v1.begin(), v1.end());//别人类型(char)的迭代器string str("hello world");vector<char> v4(str.begin(), str.end());
二、用其它类型初始化出现的问题
运行以下代码时,会发现原本应该打印【hello world】,结果却是【104 101 108 108 111 32 119 111 114 108 100】
- 原因是,char转换成int会进行【 整型提升 】,打印出ASCALL码值
//别人类型(char)的迭代器string str("hello world");vector<char> v4(str.begin(), str.end());for (auto e : v4){cout << e << " ";}cout << endl;
三、利用指针初始化
- 我们知道,迭代器行为是模拟指针,所以迭代器可以类比成 “指针”,可以用以下形式初始化
int a[] = { 16,2,77,29 };vector<int> v5(a, a+4);
五、vector的访问及遍历操作
vector访问 | 说明 |
---|---|
find | 查找 |
operator[] (重点) | 像数组一样访问 |
iterator迭代器 | while循环&auto+范围for |
[ 1 ] find
[ 2 ] operator[ ]
vector<int> v;for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;
[ 3 ] vector的 访问及遍历操作 [代码演示]——迭代器
vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;for (auto e : v){cout << e << " ";}cout << endl;
六、vector 增删查改
vector增删查改 | 接口说明 |
---|---|
push_back(重点) | 尾插 |
pop_back (重点) | 尾删 |
insert | 在position之前插入val |
erase | 删除position位置的数据 |
swap | 交换两个vector的数据空间 |
[1] 尾插&尾删
vector<string> v;string name1("hello world");v.push_back(name1);v.push_back(string("hello world"));v.push_back("hello world");
[3] 头插——insert
int a[] = { 16,2,77,29,3,33,43,3,2,3,3,2 };vector<int> v1(a, a + sizeof(a)/sizeof(int));//指针(类比利用迭代器)区间初始化
// 头插 v1.insert(v1.begin(), 100);
[4] 清除——erase
int a[] = { 16,2,77,29,3,33,43,3,2,3,3,2 };vector<int> v1(a, a + sizeof(a)/sizeof(int));//指针(类比利用迭代器)区间初始化
// 头删v1.erase(v1.begin());
[4-PLUS] 清除特定位置——erase + find函数
(1)find函数
(2)代码演示
int a[] = { 16,2,77,29,3,33,43,3,2,3,3,2 };vector<int> v1(a, a + sizeof(a)/sizeof(int));//指针(类比利用迭代器)区间初始化// 删除3,但是不知道3在哪个位置,怎么办?find//vector<int>::iterator pos = find(v1.begin(), v1.end(), 3);//利用关键字autoauto pos = find(v1.begin(), v1.end(), 3);if (pos != v1.end()){v1.erase(pos);}
七、vector 空间相关函数
【1】空间相关函数总结
容量空间 | 功能说明 |
---|---|
size | 获取数据个数 |
capacity | 获取容量大小 |
empty | 判断是否为空,如果为空 (即不存在、已被赋值为null、false、0、''或未定义),则返回true ;否则返回 false 。 |
resize(重点) | 改变vector的size |
reserve (重点) | 改变vector的capacity |
- capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。
这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义
的。vs是PJ版本STL,g++是SGI版本STL。- reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以 缓解vector增容的代价缺陷问题。
- resize在开空间的同时还会 进行初始化 ,影响size。
【2】size&capacity [代码演示]
vector<int> v1;int _size=capacity(v1);int _capacity=capacity(v1);
【3】empty [代码演示]
vector<int> v1;v1.resize(10);empty(v1);//返回false
【4】reserve&resize使用 [代码演示]
vector<int> v1;v1.resize(10);for (size_t i = 0; i < 10; i++){v1[i] = i;}vector<int> v2;v2.reserve(10);
}
相关文章:

【C++】STL容器——vector类的使用指南(含代码演示)(11)
前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一、vector类——基本介绍二、vector类…...
elementui 修改 el_table 表格颜色,表格下方多了一条线问题
解决: 加入以下代码 .el-table::before { z-index: inherit; } 如果使用了scoped,需要加上stylus /deep/ (其他的css语言有不一样的写法) 或是全局加入 body .el-table::before { z-index: inherit; } 其他背景色,表格边框颜色修改 //表头/de…...
阿里云/腾讯云国际站代理:阿里云服务器介绍
阿里云是由阿里巴巴集团旗下的云计算服务提供商。阿里云提供的服务包括云服务器、数据库服务、数据分析、人工智能、大数据、物联网等多种云计算产品和解决方案。阿里云的数据中心遍布全球多个地区,提供可靠且安全的云计算基础设施和服务。阿里云在中国以及全球范围…...

Go学习第十章——文件操作,Json和测试
Go文件操作,Json和测试 1 文件1.1 基本介绍1.2 读取的基本操作1.3 写入的基本操作1.4 使用案例(三个) 2 Go语言的Json使用2.1 序列化案例2.2 反序列化案例 3 单元测试3.1 先看个需求3.2 快速入门3.3 入门总结 1 文件 1.1 基本介绍 文件在程序中是以流的形式来操作…...
学习不同概率分布(二项分布、泊松分布等)概念及基础语法
概率分布是描述随机变量取值的概率情况的函数。常见的概率分布包括二项分布、泊松分布等。 二项分布(Binomial Distribution):描述了一次试验中成功事件发生的次数的概率分布。它的基础语法如下: 概率质量函数:pmf(k, …...
在3台不联网的 CentOS 7.8 服务器上部署 Elasticsearch 6.8 集群
为了在3台不联网的 CentOS 7.8 服务器上部署 Elasticsearch 6.8.23 集群,并考虑到path.data和path.logs的配置,我们可以按照以下步骤进行操作: 1. 准备工作 1.1 从有网络的机器下载 Elasticsearch 6.8.23 的 RPM 包: https://w…...
CentOS 7
导入已有虚拟机 设置SSH免密登录 参考Ubuntu- 远程连接虚拟机(桥连接) 宿主机:Win10虚拟机:VMware保证宿主机和主机在同一个网段下(宿主机和主机通过手机热点连接,在特定网段内,不能更改&#…...

个人记账理财软件 Money Pro mac中文版软件介绍
Money Pro for mac是一款综合性高的理财工具,Money Pro是一套能够协同工作的工具,可用来追踪账户、管理账单以及制作预算,您可以为每个时间段设置不同的预算限值。财务一切尽在掌控之中。 Money Pro for mac软件介绍 Money Pro for mac提供一…...
DSP 开发教程(0): 汇总
目录 DSP 开发教程(0): 汇总开发环境搭建DSP 开发例程 DSP 开发教程(0): 汇总 开发环境搭建 开发环境的搭建参考: Tronlong创龙 的博客. 安装 CCS v5.5 安装 BIOS_MCSDK DSP 开发例程 名称说明led_flash此例程实现在 EVM6678L 开发板控制 LED 闪烁. 使用了 SYS/BIOS 和 MC…...

YouTrack 中如何设置邮件通知
在 YouTrack 中,默认是不会邮件通知的。 你可以为你的账号设置邮件通知。 设置的方法为单击用户属性,然后在弹出的小窗口中选择属性选项。 设置邮件通知 在通知 Tab 页面中,选择发送邮件的方式,默认这个选项是不选择的。 用户…...
Prevalence and prevention of large language model use in crowd work
本文是LLM系列文章,针对《Prevalence and prevention of large language model use in crowd work》的翻译。 众包工作中使用大型语言模型的流行率和预防 摘要1 研究1:LLM使用的普遍率2 研究2:LLM使用的预防3 讨论4 材料与方法 摘要 我们表…...

微信小程序学习(02)
页面导航 - 声明式导航 1. 导航到 tabBar 页面 tabBar 页面指的是被配置为 tabBar 的页面。 在使用<navigator> 组件跳转到指定的 tabBar 页面时,需要指定 url 属性和 open-type 属性,其中: ⚫ url 表示要跳转的页面的地址࿰…...
Transit path
一、什么是Transit path "Transit" 路径通常指的是网络上的一种数据传输路线或路径,该路线用于在计算机网络中传递数据包。这个术语通常在网络和通信领域中使用,用于描述数据从一个地方传输到另一个地方的路线或路径。 在计算机网络中&#…...

backend-learning: personal blog(1)
问题记录: 跨度太大,无法完成,遂决定从基础学起。 规划路线: 1.完成JAVA与c语言差异部分,(注解,其实没多少) 2.上springboot官网查看开发手册,了解大致原理。 3. 开始挑…...
centos7系统下,实现1台服务器免密登录多台服务器功能
SSH案例:实现kafka01服务器能够免密登录kafka02和kafka03服务器的需求(不然后面一键启动的脚本将无法使用)⭐ 1:检查每台服务器是否都安装了SSH: [rootkafka01 ~]# rpm -qa |grep ssh openssh-clients-7.4p1-21.el7.…...
【力扣SQL】几个常见SQL题
【力扣SQL】184. 部门工资最高的员工 Employee:id(主键)、name、salary、departmentId(外键) Department:id(主键)、name 出每个部门中薪资最高的员工:Department.name、…...
[Python] ModuleNotFoundError: No module named ‘_ctypes‘
Python 找不到模块 此前遇到了 python 中的 _ctypes 模块丢失的问题,经排查发现是 Pyenv 安装的 python 确实缺少了此模块,后来使用 conda 安装 Python 发现 _ctypes.cpython-37m-x86_64-linux-gnu.so 此包存在。 排查方法是先全局查找相关模块ÿ…...

牛客网刷题-(5)
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...
springcloud gateway转发后getServerName被更改的问题
该问题起源于一次将代码移植到微服务产生。当使用springcloud gateway更换掉nginx网关后,出现无法登录的情况,跟进发现转发的信息里丢失了Host MimeHeaders accept */* knife4j-gateway-code ROOT content-type application/x-www-form-urlencoded …...

Linux - firewall-cmd 命令添加端口规则不生效排查
文章目录 linux 防火墙 firewall-cmd 命令详解问题排查 linux 防火墙 firewall-cmd 命令详解 基本语法 firewall-cmd --zonezone-name --add-serviceservice-name --permanent命令参数 --zone:指定要添加服务的区域名称。 --add-service:指定要添加的…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...