【c++】vector用法详解

vector用法详解

  • vector定义
  • vector容器的构造函数
  • vector容器内元素的访问
    • 1.通过下标 + [ ]来访问
    • 2.通过迭代器来访问
    • 3.通过范围for来访问
  • vector常用函数的用法解析
    • 1.size()
    • 2.clear()
    • 3.capacity()
    • 4.reserve()
    • 5.resize()
    • 6.shrink_to_fit()
    • 7.pop_back()
    • 8.push_back()
    • 9.erase()
    • 10.insert()
      • 补充:算法库中的find()
    • 11.vector iterator适用
      • 1. begin() + end()
      • 2.rbegin() + rend()

铁汁们,今天给大家分享一篇vector用法详解,来吧,开造⛳️

vector定义

💡 vector< typename> name ;

  • vector本质是顺序表,是可以更改大小的"变长数组"。

  • typename为任意类型,例如:int、char、double、string、vector。

💡 Tips:vector是可变大小数组的序列容器。vector使用动态分配数组来存储它的元素,物理空间连续,可以采用下标+[ ]对vector中的元素进行访问。在末尾插入或者删除一个元素时间复杂度为O(1),效率高,而在其他位置处进行插入或者删除一个元素时间复杂度为O(n),效率低,而对于其他物理空间不连续的容器采用迭代器或者引用的方式来访问元素效率高。

vector容器的构造函数

  • 1.构造一个没有元素的空数组a, 元素类型为typename。

💡1. vector a ;

  • 2.构造一个与容器c内元素相同的数组d, 元素类型为typename。

💡2.vector d(const vector& c) ;

  • 3.构造一个与[first, last)范围一样多元素的容器c。

💡3.vector c(iterator first, iterator last ) ;

  • 4.构造一个包含n个元素,每个元素的值为val的数组b, 元素类型为typename。

💡4.vector b(size_t n, const typename& val ) ;

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<string>using namespace std;int main()
{vector<int> a;for (auto it : a){cout << it << ' ';}vector<int> b(5, 1);for (auto it : b){cout << it << ' ';}cout << endl;string s("abcd");vector<int> c(s.begin(), s.end());//编码表-字符与ASCII值对应的表,内存中实际存储的是字符所对应的ASCII值for (auto it : c){cout << it << ' ';}cout << endl;vector<int> d(b);for (auto it : d){cout << it << ' ';}return 0;
}

在这里插入图片描述

vector容器内元素的访问

1.通过下标 + [ ]来访问

for (int i = 0; i < v.size(); i++){cout << v[i] << ' ';
}
cout << endl;

2.通过迭代器来访问

vector<int>::iterator it = v.begin();
while (it != v.end())
{cout << *it << ' ';it++;
}
cout << endl;

3.通过范围for来访问

for (auto it : v) //只要该容器支持迭代器,就支持范围for,原因:范围for的底层实现为迭代器
{cout << it << ' ';
}
cout << endl;

💡 Tips:只要某个容器支持迭代器,就支持范围for, 原因:范围for的底层实现为迭代器。

vector常用函数的用法解析

1.size()

💡 1.size_t size( )const ;

  • 功能:获得vector中元素的总个数,元素类型为typename。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<string> v1(5, "1111"); //cout << v1.size() << endl;vector<int> v2;v2.push_back(1);v2.push_back(2);v2.push_back(3);vector<int> v3(v2.begin() + 1, v2.end());cout << v2.size() << endl << v3.size() << endl;return 0;
}

在这里插入图片描述

2.clear()

💡2.void clear( ) ;

  • 功能:使vector中元素的总个数size变为0,但容量capacity不变。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v(4, 2);cout << v.size() << ' ' << v.capacity() << endl;v.clear();cout << v.size() << ' ' << v.capacity() << endl;return 0;
}

在这里插入图片描述

3.capacity()

💡3.size_t capacity( )const ;

  • 功能:获得当前分配给vector存储空间的大小。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v; //测试vs下vector默认的扩容机制 -》1.5倍size_t sz = v.capacity();cout << "start capacity:" << sz << endl;for (size_t i = 0; i < 100; i++){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "changed capacity:" << sz << endl;}}return 0;
}

在这里插入图片描述

💡 Tips:在vs下capacity呈1.5倍增长的,vs是PJ版本的STL、在g++(linux)下capacity呈2倍增长的,g++是 SGI版本的STL。vector的增容,具体增多少,不能固化,在不同编译器下增容的定义是不同的。

4.reserve()

4.void reserve(size_t n) ;

  • 功能:使得vector容器存储空间的大小为n。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v;for (size_t i = 1; i < 15; i++)v.push_back(i);cout << v.size() << ' ' << v.capacity() << endl;v.reserve(16); //情况一: size < n < capacity ->size不变,capacity不变cout << v.size() << ' ' << v.capacity() << endl;v.reserve(22); //情况二: n > capacity  ->size不变,capacity改变,扩容cout << v.size() << ' ' << v.capacity() << endl;for (auto it : v){cout << it << ' ';}cout << endl;v.reserve(5); //情况三: size > n ->size改变,size不变,capacity不变cout << v.size() << ' ' << v.capacity() << endl;return 0;
}
  • 相当于扩容,不会初始化。

  • 不会改变数据,只会改变容量。当n < size 或 size < n < capacity,在vs下不会缩容,在g++下会缩容。

  • reserve(n),是否会开辟n个空间,取决于编译器,仅仅是向编译器做了个请求工作。

  • 已知需开辟空间的大小为n,可以使用reserve(n),从而减少扩容的次数,提高效率,因为扩容有损耗。

在这里插入图片描述

5.resize()

💡5.void resize(size_t n, const typename& val = typename( ) ) ;

  • 功能:调整vector容器的大小,使其内元素个数变为n。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v;for (size_t i = 1; i < 15; i++)v.push_back(i);cout << v.size() << ' ' << v.capacity() << endl;v.resize(16); //情况一: size < n < capacity ->size改变,capacity不变,插入数据cout << v.size() << ' ' << v.capacity() << endl;v.resize(22); //情况二: n > capacity  ->size改变,capacity改变,扩容+插入数据cout << v.size() << ' ' << v.capacity() << endl;for (auto it : v){cout << it << ' ';}cout << endl;return 0;}v.resize(5); //情况三: size > n ->size改变,capacity不变,删除数据cout << v.size() << ' ' << v.capacity() << endl;return 0;
}

在这里插入图片描述

  • 相当于扩容 + 初始化。
  • 既改变容量,又改变数据。当n < size 或 size < n < capacity,在vs下不会缩容,在g++下会缩容。
  • 情况一: size > n ->size改变,capacity不变,删除数据 ;情况二: size < n < capacity
    ->size改变,capacity不变,插入数据 ; 情况三: n > capacity ->size改变,capacity改变,扩容+插入数据 。
  • 初始化处默认给缺省值,缺省值为无参构造函数,自定义类型会去调它自己的默认构造函数,c++11为了兼容模板,使得内置类型也有构造函数,内置类型得无参构造函数初始化为0eg:int
    val = int(), val = 0、double val = double(),val = 0.0,int* val =
    int*() , val = nullptr、char val = char(), val = ‘\0’。

6.shrink_to_fit()

💡void shrink_to_fit( ) ;

  • 功能:缩容,使capacity()减小到与size()大小相同。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v;for (size_t i = 1; i < 15; i++)v.push_back(i);cout << v.size() << ' ' << v.capacity() << endl;v.resize(5);cout << v.size() << ' ' << v.capacity() << endl;v.shrink_to_fit();cout << v.size() << ' ' << v.capacity() << endl;return 0;
}

在这里插入图片描述

7.pop_back()

💡void pop_back( ) ;

  • 功能:删除最后一个元素。
  • 8.push_back()

💡void push_back( ) ;

  • 功能:在末尾插入一个元素。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>using namespace std;int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);for (auto it : v){cout << it << ' ';}cout << endl;v.pop_back();for (auto it : v){cout << it << ' ';}cout << endl;return 0;
}

在这里插入图片描述

9.erase()

💡void erase(iterator position) ;

  • 功能:删除指定位置(迭代器)处的值。
#define _CRT_SECURE_NO_WARNINGS 1
#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.erase(v.begin() + 1);for (auto it : v){cout << it << ' ';}cout << endl;return 0;
}

在这里插入图片描述

10.insert()

💡void insert(iterator position , const typename& x) ;

  • 功能:在指定的位置(迭代器)前插入元素x。

💡void insert(iterator position , iterator first , iterator end) ;

  • 功能: 在指定位置(迭代器)前插入与范围[first , end)一样多元素的容器

补充:算法库中的find()

💡iterator find(iterator first, iterator end, const typename& x) ;

  • 功能:在范围[first, end)容器中查找与x相同的元素,若查找到了,则返回查找到的元素所在的位置(迭代器),否则返回end(迭代器)。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>using namespace std;int main()
{vector<int> v1(5, 2);vector<int> v2(3, 6);v1.insert(v1.begin() + 2, 3);v1.insert(v1.begin(), v2.begin(), v2.end());for (auto it : v1){cout << it << ' ';}cout << endl;vector<int>::iterator p = find(v1.begin() + 1, v1.end(), 3);if (p != v1.end())cout << "查找到了" << endl;elsecout << "查找不到" << endl;return 0;
}

在这里插入图片描述

  • 头文件为#include。
  • 是函数模板,泛型编程,不是针对于某个容器的迭代器实现的,而是针对于所有容器的迭代器实现的。

11.vector iterator适用

1. begin() + end()

💡iterator begin( )、const_iterator begin( )const

  • 功能:返回第一个元素的位置(迭代器)。

Tips:const_iterator 修饰的是迭代器所指向的元素不能被修改,而迭代器本身可以被修改。const修饰this指针,表示在该成员函数中成员变量不允许被修改,此处const的用法只能用于类中的成员函数。

💡iterator end( )、const_iterator end( )const ;

  • 功能:返回最后一个元素的下一个位置(迭代器)。

2.rbegin() + rend()

💡iterator rbegin( )、const_iterator rbegin( )const ;

  • 功能:返回最后一个元素的位置(迭代器)。

💡iterator rend( )、const_iterator rend( )const ;

  • 功能:返回第一个元素的前一个位置(迭代器)。
    在这里插入图片描述

铁铁们,vector用法详解就到此结束啦,若博主有不好的地方,请指正,欢迎铁铁们留言,请动动你们的手给作者点个👍鼓励吧,你们的鼓励就是我的动力✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/251284.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用潜在向量进行检测、屏蔽和重建以进行遮挡的面部表情识别

Latent-OFER: Detect, Mask, and Reconstruct with Latent Vectors for Occluded Facial Expression Recognition 一、创新点 &#xff08;1&#xff09;提出了一种与表情相关的特征提取器&#xff0c;它使用空间注意力为特定的面部特征分配更高的权重&#xff0c;从而使我们能…

【Linux】统信服务器操作系统V20 1060a-AMD64 Vmware安装

目录 ​编辑 一、概述 1.1 简介 1.2 产品特性 1.3 镜像下载 二、虚拟机安装 一、概述 1.1 简介 官网&#xff1a;统信软件 – 打造操作系统创新生态 统信服务器操作系统V20是统信操作系统&#xff08;UOS&#xff09;产品家族中面向服务器端运行环境的&#xff0c;是一款…

Python 轻量级定时任务调度:APScheduler

简述 APscheduler (Advanced Python Scheduler)&#xff0c;作用为按指定的时间规则执行指定的作业。提供了基于日期date、固定时间间隔interval 、以及类似于Linux上的定时任务crontab类型的定时任务。该框架不仅可以添加、删除定时任务&#xff0c;还可以将任务存储到数据库…

【Docker】WSL(Windows Subsystem for Linux)常见命令解释说明以及简单使用

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

使用gcc/g++查看C语言预处理,编译,汇编,连接,以及动静态库的区分

文章目录 使用gcc/ggcc如何完成编译后生成可执行文件&#xff1f;预处理(进行宏替换)编译&#xff08;生成汇编&#xff09;汇编&#xff08;生成机器可识别代码&#xff09;连接&#xff08;生成可执行文件或库文件&#xff09;最后记忆小技巧 在这里涉及到一个重要的概念&…

Pandas.DataFrame.cumsum() 累积和 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

备份RK35XX 设备的ubuntu根文件系统的方法

简介 我们使用 RK35XX 提供的SDK包制作了一个完整的 ubuntu 镜像,烧录到设备中,会在设备中安装很多我们需要的软件,运行的一些自己写的脚本和业务程序,当我们有很多台设备时,不可能每台都一个个去安装,此时我们就需要一个工具来备份当前设备的根文件系统,然后再放到 SD…

智能决策的艺术:探索商业分析的最佳工具和方法

文章目录 一、引言二、商业分析思维概述三、数据分析在商业实践中的应用四、如何培养商业分析思维与实践能力五、结论《商业分析思维与实践&#xff1a;用数据分析解决商业问题》亮点内容简介作者简介目录获取方式 一、引言 随着大数据时代的来临&#xff0c;商业分析思维与实…

C语言指针的几种用途

先看题目&#xff0c;写一个fun函数&#xff0c;统计一个字符串中某个字符出现的次数&#xff0c;以及这个字符第一次出现的位置。 看起来很简单&#xff0c;似乎几行就可以搞定&#xff0c;但是写出来之后&#xff0c;才发现代码怎么这么长&#xff01;程序里多处使用了指针&…

Elasticsearch(ES) 简述请求操作索引下文档 增删查改操作

上文 Elasticsearch(ES) 创建带有分词器规则的索引 带着大家创建了一个带有分词功能的索引 老规矩 我们启动一下ES服务 本文 我们就来说说 关于文档的操作 我们先来添加一个文档 就像数据库加一条数据一样 这里 并不需要指定什么表结构和数据结构 它的文档结构是无模式的 添…

PyTorch 2.2 中文官方教程(十七)

&#xff08;Beta&#xff09;使用缩放点积注意力&#xff08;SDPA&#xff09;实现高性能 Transformer 原文&#xff1a;pytorch.org/tutorials/intermediate/scaled_dot_product_attention_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这…

从领域外到领域内:LLM在Text-to-SQL任务中的演进之路

导语 本文介绍了ODIS框架&#xff0c;这是一种新颖的Text-to-SQL方法&#xff0c;它结合了领域外示例和合成生成的领域内示例&#xff0c;以提升大型语言模型在In-context Learning中的性能。 标题&#xff1a;Selective Demonstrations for Cross-domain Text-to-SQL会议&am…

Jenkins任意文件读取漏洞(CVE-2024-23897)复现

Jenkins 有一个内置的命令行界面CLI&#xff0c;在处理 CLI 命令时Jenkins 使用args4j 库解析 Jenkins 控制器上的命令参数和选项。此命令解析器具有一个功能&#xff0c;可以将参数中后跟文件路径的字符替换为文件内容 ( expandAtFiles)。具有Overall/Read权限的攻击者可以读取…

成都爱尔林江院长解读儿童青少年为什么一定要进行医学验光配镜

根据国家卫健委数据显示&#xff1a;我国青少年儿童总体近视率为52.7%、高度近视人口超3000万。近视学生中,有10%为高度近视,且占比随年级升高而增长。 近视孩子之多&#xff0c;孩子视力发展备受关注。戴镜进行近视防控十分必要&#xff0c;且眼镜不可随意验配&#xff01; 成…

PAT-Apat甲级题1007(python和c++实现)

PTA | 1007 Maximum Subsequence Sum 1007 Maximum Subsequence Sum 作者 CHEN, Yue 单位 浙江大学 Given a sequence of K integers { N1​, N2​, ..., NK​ }. A continuous subsequence is defined to be { Ni​, Ni1​, ..., Nj​ } where 1≤i≤j≤K. The Maximum Su…

论文阅读-MapReduce

论文名称&#xff1a;MapReduce: Simplified Data Processing on Large Clusters 翻译的效果不是很好&#xff0c;有空再看一遍&#xff0c;参照一下别人翻译的。 MapReduce:Simplified Data Processing on Large Clusters 中文翻译版(转) - 阿洒 - 博客园 (cnblogs.com) 概…

仰暮计划|“如果你想看到世界上最完美的笑容,你就要多一点儿时间跟老人在一起,老人笑了,你就看到了。”

敬老从心开始&#xff0c;助老从我做起 时值假期&#xff0c;我们有了时间&#xff0c;决定好好践行孝亲敬老的传统美德。会计学院红心使者敬老院访问团在7月6日上午在河南省郑州市新郑市“华信老年公寓”进行实践活动。 一早来到敬老院&#xff0c;老人们都已经开始择菜&…

某赛通电子文档安全管理系统 PolicyAjax SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

Redis核心技术与实战【学习笔记】 - 19.Pika:基于SSD实现大容量“Redis”

前言 随着业务数据的增加&#xff08;比如电商业务中&#xff0c;随着用户规模和商品数量的增加&#xff09;&#xff0c;就需要 Redis 能保存更多的数据。你可能会想到使用 Redis 切片集群&#xff0c;把数据分散保存到不同的实例上。但是这样做的话&#xff0c;如果要保存的…

【鸿蒙】大模型对话应用(三):跨Ability跳转页面

Demo介绍 本demo对接阿里云和百度的大模型API&#xff0c;实现一个简单的对话应用。 DecEco Studio版本&#xff1a;DevEco Studio 3.1.1 Release HarmonyOS SDK版本&#xff1a;API9 关键点&#xff1a;ArkTS、ArkUI、UIAbility、网络http请求、列表布局、层叠布局 页面跳…