当前位置: 首页 > 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;指定要添加的…...

在ABAQUS中用SPH模拟倒酒过程,超有趣的小探索

ABAQUS模拟倒酒过程&#xff0c;酒用sph模拟最近在玩ABAQUS&#xff0c;突发奇想试试模拟倒酒过程&#xff0c;酒用SPH&#xff08;光滑粒子流体动力学&#xff09;方法来模拟&#xff0c;那效果简直绝了&#xff0c;跟大家分享分享我的折腾经历。 为啥选SPH模拟酒&#xff1f;…...

嵌入式开发新助手:Phi-4-mini-reasoning在STM32项目中的代码审查与优化

嵌入式开发新助手&#xff1a;Phi-4-mini-reasoning在STM32项目中的代码审查与优化 1. 嵌入式开发的痛点与机遇 在STM32这类资源受限的嵌入式开发中&#xff0c;工程师们常常面临一个两难困境&#xff1a;既要保证代码执行效率满足实时性要求&#xff0c;又要严格控制ROM和RA…...

OpenClaw备份策略:Qwen3-14B镜像+自动化配置云端同步

OpenClaw备份策略&#xff1a;Qwen3-14B镜像自动化配置云端同步 1. 为什么需要备份OpenClaw系统 上周我的主力开发机突然硬盘故障&#xff0c;导致三个月的OpenClaw配置和技能包全部丢失。这种切肤之痛让我意识到&#xff1a;自动化系统越是智能&#xff0c;灾备方案就越要可…...

Xamarin.Macios部署与发布:从开发到上架的完整流程

Xamarin.Macios部署与发布&#xff1a;从开发到上架的完整流程 【免费下载链接】xamarin-macios .NET for iOS, Mac Catalyst, macOS, and tvOS provide open-source bindings of the Apple SDKs for use with .NET managed languages such as C# 项目地址: https://gitcode.…...

OpenClaw+Qwen2.5-VL-7B:个人社交媒体自动化图文创作

OpenClawQwen2.5-VL-7B&#xff1a;个人社交媒体自动化图文创作 1. 为什么选择OpenClaw做社交媒体自动化 去年我开始运营一个科技类自媒体账号&#xff0c;最初每天花3小时手动找素材、写文案、配图。直到发现OpenClaw这个开源框架&#xff0c;我的工作流彻底改变了——现在9…...

聊聊jvm的内存结构, 以及各种结构的作用

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

芯片行业的高门槛本质上是一次性固定成本极高导致的

AI 工具这波热潮里&#xff0c;芯片圈有个声音&#xff1a;以后一个人能不能做一颗芯片&#xff1f;很多人讨论的时候跑偏了&#xff0c;一直在聊人效、聊 AI 能替代多少工程师。真正的瓶颈根本不在这里。做过项目的人都知道&#xff0c;一个芯片项目的成本结构大概长这样&…...

**雾计算中的边缘智能:基于Python的轻量级任务调度系统设计与实现**在物联网(IoT)飞速发展

雾计算中的边缘智能&#xff1a;基于Python的轻量级任务调度系统设计与实现 在物联网&#xff08;IoT&#xff09;飞速发展的今天&#xff0c;传统云计算模式已难以满足低延迟、高带宽和实时响应的需求。**雾计算&#xff08;Fog Computing&#xff09;**作为云与终端设备之间的…...

STM32 OLED三级菜单框架设计与实现

1. STM32 OLED菜单界面框架设计概述在嵌入式设备开发中&#xff0c;人机交互界面是连接用户与硬件的重要桥梁。基于STM32微控制器和OLED显示屏构建的菜单系统&#xff0c;因其低成本、低功耗和高对比度显示特性&#xff0c;在工业控制、智能家居和便携设备等领域广泛应用。本文…...

SpringBoot的两种启动方式原理

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...