当前位置: 首页 > news >正文

【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中的某个节点

【注意点】

  1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动
  2. 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)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一、vector类——基本介绍二、vector类…...

elementui 修改 el_table 表格颜色,表格下方多了一条线问题

解决&#xff1a; 加入以下代码 .el-table::before { z-index: inherit; } 如果使用了scoped&#xff0c;需要加上stylus /deep/ (其他的css语言有不一样的写法) 或是全局加入 body .el-table::before { z-index: inherit; } 其他背景色&#xff0c;表格边框颜色修改 //表头/de…...

阿里云/腾讯云国际站代理:阿里云服务器介绍

阿里云是由阿里巴巴集团旗下的云计算服务提供商。阿里云提供的服务包括云服务器、数据库服务、数据分析、人工智能、大数据、物联网等多种云计算产品和解决方案。阿里云的数据中心遍布全球多个地区&#xff0c;提供可靠且安全的云计算基础设施和服务。阿里云在中国以及全球范围…...

Go学习第十章——文件操作,Json和测试

Go文件操作&#xff0c;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 基本介绍 文件在程序中是以流的形式来操作…...

学习不同概率分布(二项分布、泊松分布等)概念及基础语法

概率分布是描述随机变量取值的概率情况的函数。常见的概率分布包括二项分布、泊松分布等。 二项分布&#xff08;Binomial Distribution&#xff09;&#xff1a;描述了一次试验中成功事件发生的次数的概率分布。它的基础语法如下&#xff1a; 概率质量函数&#xff1a;pmf(k, …...

在3台不联网的 CentOS 7.8 服务器上部署 Elasticsearch 6.8 集群

为了在3台不联网的 CentOS 7.8 服务器上部署 Elasticsearch 6.8.23 集群&#xff0c;并考虑到path.data和path.logs的配置&#xff0c;我们可以按照以下步骤进行操作&#xff1a; 1. 准备工作 1.1 从有网络的机器下载 Elasticsearch 6.8.23 的 RPM 包&#xff1a; https://w…...

CentOS 7

导入已有虚拟机 设置SSH免密登录 参考Ubuntu- 远程连接虚拟机&#xff08;桥连接&#xff09; 宿主机&#xff1a;Win10虚拟机&#xff1a;VMware保证宿主机和主机在同一个网段下&#xff08;宿主机和主机通过手机热点连接&#xff0c;在特定网段内&#xff0c;不能更改&#…...

个人记账理财软件 Money Pro mac中文版软件介绍

Money Pro for mac是一款综合性高的理财工具&#xff0c;Money Pro是一套能够协同工作的工具&#xff0c;可用来追踪账户、管理账单以及制作预算&#xff0c;您可以为每个时间段设置不同的预算限值。财务一切尽在掌控之中。 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 中&#xff0c;默认是不会邮件通知的。 你可以为你的账号设置邮件通知。 设置的方法为单击用户属性&#xff0c;然后在弹出的小窗口中选择属性选项。 设置邮件通知 在通知 Tab 页面中&#xff0c;选择发送邮件的方式&#xff0c;默认这个选项是不选择的。 用户…...

Prevalence and prevention of large language model use in crowd work

本文是LLM系列文章&#xff0c;针对《Prevalence and prevention of large language model use in crowd work》的翻译。 众包工作中使用大型语言模型的流行率和预防 摘要1 研究1&#xff1a;LLM使用的普遍率2 研究2&#xff1a;LLM使用的预防3 讨论4 材料与方法 摘要 我们表…...

微信小程序学习(02)

页面导航 - 声明式导航 1. 导航到 tabBar 页面 tabBar 页面指的是被配置为 tabBar 的页面。 在使用<navigator> 组件跳转到指定的 tabBar 页面时&#xff0c;需要指定 url 属性和 open-type 属性&#xff0c;其中&#xff1a; ⚫ url 表示要跳转的页面的地址&#xff0…...

Transit path

一、什么是Transit path "Transit" 路径通常指的是网络上的一种数据传输路线或路径&#xff0c;该路线用于在计算机网络中传递数据包。这个术语通常在网络和通信领域中使用&#xff0c;用于描述数据从一个地方传输到另一个地方的路线或路径。 在计算机网络中&#…...

backend-learning: personal blog(1)

问题记录&#xff1a; 跨度太大&#xff0c;无法完成&#xff0c;遂决定从基础学起。 规划路线&#xff1a; 1.完成JAVA与c语言差异部分&#xff0c;&#xff08;注解&#xff0c;其实没多少&#xff09; 2.上springboot官网查看开发手册&#xff0c;了解大致原理。 3. 开始挑…...

centos7系统下,实现1台服务器免密登录多台服务器功能

SSH案例&#xff1a;实现kafka01服务器能够免密登录kafka02和kafka03服务器的需求&#xff08;不然后面一键启动的脚本将无法使用&#xff09;⭐ 1&#xff1a;检查每台服务器是否都安装了SSH&#xff1a; [rootkafka01 ~]# rpm -qa |grep ssh openssh-clients-7.4p1-21.el7.…...

【力扣SQL】几个常见SQL题

【力扣SQL】184. 部门工资最高的员工 Employee&#xff1a;id&#xff08;主键&#xff09;、name、salary、departmentId&#xff08;外键&#xff09; Department&#xff1a;id&#xff08;主键&#xff09;、name 出每个部门中薪资最高的员工&#xff1a;Department.name、…...

[Python] ModuleNotFoundError: No module named ‘_ctypes‘

Python 找不到模块 此前遇到了 python 中的 _ctypes 模块丢失的问题&#xff0c;经排查发现是 Pyenv 安装的 python 确实缺少了此模块&#xff0c;后来使用 conda 安装 Python 发现 _ctypes.cpython-37m-x86_64-linux-gnu.so 此包存在。 排查方法是先全局查找相关模块&#xff…...

牛客网刷题-(5)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

springcloud gateway转发后getServerName被更改的问题

该问题起源于一次将代码移植到微服务产生。当使用springcloud gateway更换掉nginx网关后&#xff0c;出现无法登录的情况&#xff0c;跟进发现转发的信息里丢失了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&#xff1a;指定要添加服务的区域名称。 --add-service&#xff1a;指定要添加的…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...