【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:指定要添加的…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...



