C++初阶:容器(Containers)vector常用接口详解
介绍完了string类的相关内容后:C++初阶:适合新手的手撕string类(模拟实现string类)
接下来进入新的篇章,容器vector介绍:
文章目录
- 1.vector的初步介绍
- 2.vector的定义(constructor)
- 3.vector迭代器( iterator )
- 4.vector的三种遍历
- 4.1正常for循环
- 4.2范围for循环
- 4.3两种迭代器(正向和反向)
- 5.vector扩容相关(resize和reserve)
- 5.2reserve()
- 5.2resize()
- 6. vector 增删查改
- 6.1push_back和pop_back
- 6.2find、Insert、erase
- 6.3swap
1.vector的初步介绍
翻译过来就是:
- vector是表示可变大小数组的序列容器
- 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理
- 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
- vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
- 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
- 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好
2.vector的定义(constructor)
- 默认构造函数:
explicit vector (const allocator_type& alloc = allocator_type())
。这是默认构造函数,它创建一个空的std::vector
对象。如果提供了分配器(allocator),则使用提供的分配器;否则使用默认分配器。 - 填充构造函数:
explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type())
。这个构造函数创建一个包含==n
个元素的std::vector
,每个元素的值都是val
==。同样地,您可以选择提供一个分配器,如果没有提供,则使用默认分配器。 - 范围构造函数:
template <class InputIterator> vector (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())
。这个构造函数使用迭代器范围[first, last)
中的元素来初始化std::vector
。这使得您可以使用另一个容器的一部分或全部元素来初始化std::vector
。 - 复制构造函数:
vector (const vector& x)
。这个构造函数创建一个新的std::vector
,并使用另一个std::vector
x
中的元素进行初始化
构造函数声明 | 接口说明 |
---|---|
vector()(重点) | 无参构造 |
vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
vector(const vector& x)(重点) | 拷贝构造 |
vector(InputIterator first, InputIterator last) | 使用迭代器进行初始化构造 |
int main()
{vector<int> v1;//空参构造vector<int> v2(5, 1);//构造并初始化5个1vector<int> v3(v2);//拷贝构造string s1("abc");vector<int> v4(s1.begin(), s1.end());//使用迭代器进行初始化构造return 0;
}
这里v4中都存的是ASCII码值
3.vector迭代器( iterator )
迭代器 | 说明 |
---|---|
begin | 获取第一个数据位置的iterator/const_iterator |
end | 获取最后一个数据的下一个位置的iterator/const_iterator |
rbegin | 获取最后一个数据位置的reverse_iterator (反向迭代器的移动方向是与正向迭代器相反的,即 ++ 操作符会使迭代器向前移动,而 -- 操作符会使迭代器向后移动) |
rend | 获取第一个数据前一个位置的reverse_iterator |
4.vector的三种遍历
4.1正常for循环
void test2()
{string s1("abc");vector<char> v(s1.begin(), s1.end());//使用迭代器进行初始化构造for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}
}int main()
{test2();
}
4.2范围for循环
void test3()
{string s1("abc");vector<int> v(s1.begin(), s1.end());//这里用int,不是charfor (auto e : v){cout << e << " ";}
}int main()
{test3();
}
4.3两种迭代器(正向和反向)
void test4()
{string s1("abc");vector<char> v(s1.begin(), s1.end());//使用迭代器进行初始化构造vector<char>::iterator it = v.begin();//正向遍历while (it != v.end()){cout << *it << " ";it++;}cout << endl;vector<char>::reverse_iterator rit = v.rbegin();//反向遍历while (rit != v.rend()){cout << *rit << " ";rit++;//是++不是--}//反向迭代器的移动方向是与正向迭代器相反的//即 ++ 操作符会使迭代器向前移动,而 -- 操作符会使迭代器向后移动
}int main()
{test4();
}
5.vector扩容相关(resize和reserve)
接口 | 说明 |
---|---|
size | 获取数据个数 |
capacity | 获取容量大小 |
empty | 判断是否为空 |
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
5.2reserve()
reserve
函数用于改变容器的容量,即修改容器内部用于存储元素的空间大小。这个函数可以用来避免多次重新分配内存的开销,从而提高性能。但需要注意的是,reserve
只会增加容器的容量,而不会影响容器的大小
void test5()
{vector<int> v(10, 1);//10个1cout << v.capacity() << endl;v.reserve(20);cout << v.capacity() << endl;v.reserve(15);cout << v.capacity() << endl;v.reserve(5);cout << v.capacity() << endl;
}int main()
{test5();
}
5.2resize()
resize
函数用于改变容器的大小,即修改容器中元素的数量。如果将resize
函数的参数设置为比当前大小小的值,那么容器将缩小到指定的大小,并丢弃多余的元素。如果将参数设置为比当前大小大的值,那么容器将增大到指定的大小,并且新元素不指明的话将被默认构造(对于内置类型,新元素将被初始化为 0)
void test6()
{vector<int> v(10, 1);//10个1cout << "capacity:" << v.capacity() << "size:" << v.size() << endl;v.resize(20);cout << "capacity:" << v.capacity() << "size:" << v.size() << endl;v.resize(15);cout << "capacity:" << v.capacity() << "size:" << v.size() << endl;v.resize(5);cout << "capacity:" << v.capacity() << "size:" << v.size() << endl;
}int main()
{test6();
}
6. vector 增删查改
接口 | 说明 |
---|---|
push_back | 尾部插入元素 |
pop_back | 尾部删除元素 |
find | 查找元素 |
insert | 在指定位置插入元素 |
erase | 删除指定位置的元素 |
swap | 交换两个 vector 的数据空间 |
operator[] | 像数组一样使用下标访问元素 |
6.1push_back和pop_back
void test7()
{vector<int> v(10, 1);//10个1for (auto e : v){cout << e << " ";}cout << endl;v.push_back(10);for (auto e : v){cout << e << " ";}cout << endl;v.pop_back();for (auto e : v){cout << e << " ";}cout << endl;
}int main()
{test7();
}
6.2find、Insert、erase
find
:- 形式:
iterator find (iterator first, iterator last, const T& val);
- 参数说明:
first
和last
表示查找范围的起始和结束迭代器;val
是要查找的值 - 作用:在指定范围内查找指定的值,并返回第一个匹配元素的迭代器
- 形式:
insert
:- 形式:
iterator insert (iterator position, const T& val);
- 参数说明:
position
表示插入位置的迭代器;val
是要插入的值 - 作用:在指定位置之前插入一个元素
- 形式:
erase
:- 形式:
iterator erase (iterator position);
和iterator erase (iterator first, iterator last);
- 参数说明:
position
表示要删除的位置的迭代器;first
和last
表示要删除的范围的起始和结束迭代器 - 作用:删除指定位置的元素,或者指定范围内的元素
- 形式:
void test8()
{vector<int> v;for (int i = 1; i < 6; i++){v.push_back(i);}for (auto e : v){cout << e << " ";}cout << endl;vector<int>::iterator it = find(v.begin(), v.end(), 3);//找到3的位置v.insert(it, 0);//插入for (auto e : v){cout << e << " ";}cout << endl;v.erase(v.begin(),v.end());//全删了for (auto e : v){cout << e << " ";}cout << endl;
}int main()
{test8();
}
6.3swap
swap
:
- 形式:
void swap (vector& x);
- 参数说明:
x
是另一个 vector - 作用:交换两个 vector 的数据空间,使它们的内容互相交换
void test9()
{vector<int> v1;for (int i = 1; i < 6; i++){v1.push_back(i);}vector<int> v2(10, 1);cout << "还没交换" << endl;for (auto e : v1){cout << e << " ";}cout << endl;v1.swap(v2);//二者交换cout << "交换后" << endl;for (auto e : v1){cout << e << " ";}cout << endl;
}int main()
{test9();
}
常用的接口就这些了,下次就来进行模拟实现了,感谢大家支持!!!
相关文章:

C++初阶:容器(Containers)vector常用接口详解
介绍完了string类的相关内容后:C初阶:适合新手的手撕string类(模拟实现string类) 接下来进入新的篇章,容器vector介绍: 文章目录 1.vector的初步介绍2.vector的定义(constructor)3.v…...

flink写入es的参数解析
ElasticsearchSink内部使用BulkProcessor一次将一批动作(ActionRequest)发送到ES集群。在发送批量动作前,BulkProcessor先缓存,再刷新。缓存刷新的间隔,支持基于Action数量、基于Action大小、基于时间间隔3种策略。BulkProcessor支持在同一次…...

逆向工程:揭开科技神秘面纱的艺术
在当今这个科技飞速发展的时代,我们每天都在与各种电子产品、软件应用打交道。然而,你是否想过,这些看似复杂的高科技产品是如何被创造出来的?今天,我们就来探讨一下逆向工程这一神秘而又令人着迷的领域。 一、什么是…...

决策树的相关知识点
📕参考:ysu老师课件西瓜书 1.决策树的基本概念 【决策树】:决策树是一种描述对样本数据进行分类的树形结构模型,由节点和有向边组成。其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出ÿ…...

【数据结构】单向链表实现 超详细
目录 一. 单链表的实现 1.准备工作及其注意事项 1.1 先创建三个文件 1.2 注意事项:帮助高效记忆和理解 2.链表的基本功能接口 2.0 创建一个 链表 2.1 链表的打印 3.链表的创建新节点接口 4.链表的节点插入功能接口 4.1 尾插接口 4.2 头插接口 4.3 指定位…...

Opencc4j 开源中文繁简体使用介绍
Opencc4j Opencc4j 支持中文繁简体转换,考虑到词组级别。 Features 特点 严格区分「一简对多繁」和「一简对多异」。 完全兼容异体字,可以实现动态替换。 严格审校一简对多繁词条,原则为「能分则不合」。 词库和函数库完全分离,…...

vue 下载二进制文件
文章目录 概要技术细节 概要 vue 下载后端返回的二进制文件流 技术细节 import axios from "axios"; const baseUrl process.env.VUE_APP_BASE_API; //downLoadPdf("/pdf/download?pdfName" res .pdf, res); export function downLoadPdf(str, fil…...

数据结构之堆排序
对于几个元素的关键字序列{K1,K2,…,Kn},当且仅当满足下列关系时称其为堆,其中 2i 和2i1应不大于n。 { K i ≤ K 2 i 1 K i ≤ K 2 i 或 { K i ≥ K 2 i 1 K i ≥ K 2 i {\huge \{}^{K_i≤K_{2i}} _{K_i≤K_{2i1}} …...

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之ScrollBar组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之ScrollBar组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、ScrollBar组件 鸿蒙(HarmonyOS)滚动条组件ScrollBar&…...

读论文:DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior
DiffBIR 发表于2023年的ICCV,是一种基于生成扩散先验的盲图像恢复模型。它通过两个阶段的处理来去除图像的退化,并细化图像的细节。DiffBIR 的优势在于提供高质量的图像恢复结果,并且具有灵活的参数设置,可以在保真度和质量之间进…...

基于微信小程序的新生报到系统的研究与实现,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

分享一下 uniapp 打包安卓apk
首先需要安装 Java 环境,这里就不做解释了 第二步:打开 mac 终端 / cmd 命令行工具 使用keytool -genkey命令生成证书 keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore *testalias 是证书别名&am…...

DevOps落地笔记-21|业务价值:软件发布的最终目的
上一课时介绍如何度量软件的内部质量和外部质量。在外部质量中,我们提到用户满意度是衡量软件外部质量的关键因素。“敏捷宣言”的第一条原则规定:“我们最重要的目标,是通过持续不断的及早交付有价值的软件使用户满意”。从这一点也可以看出…...

【动态规划】【前缀和】【数学】2338. 统计理想数组的数目
作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode:2338. 统计理想数组的数目 给你两个整数 n 和 maxValue ,用于描述一个 理想…...

【已解决】onnx转换为rknn置信度大于1,图像出现乱框问题解决
前言 环境介绍: 1.编译环境 Ubuntu 18.04.5 LTS 2.RKNN版本 py3.8-rknn2-1.4.0 3.单板 迅为itop-3568开发板 一、现象 采用yolov5训练并将pt转换为onnx,再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn出现置信度大于1,并且图像乱框问题…...

多路服务器技术如何处理大量并发请求?
在当今的互联网时代,随着用户数量的爆炸性增长和业务规模的扩大,多路服务器技术已成为处理大量并发请求的关键手段。多路服务器技术是一种并行处理技术,它可以通过多个服务器同时处理来自不同用户的请求,从而显著提高系统的整体性…...

SpringBoot - 不加 @EnableCaching 标签也一样可以在 Redis 中存储缓存?
网上文章都是说需要在 Application 上加 EnableCaching 注解才能让缓存使用 Redis,但是测试发现不用 EnableCaching 也可以使用 Redis,是网上文章有问题吗? 现在 Application 上用了 EnableAsync,SpringBootApplication࿰…...

Linux------命令行参数
目录 前言 一、main函数的参数 二、命令行控制实现计算器 三、实现touch指令 前言 当我们在命令行输入 ls -al ,可以查看当前文件夹下所有文件的信息,还有其他的如rm,touch等指令,都可以帮我们完成相应的操作。 其实运行这些…...

LLM少样本示例的上下文学习在Text-to-SQL任务中的探索
导语 本文探索了如何通过各种提示设计策略,来增强大型语言模型(LLMs)在Few-shot In-context Learning中的文本到SQL转换能力。通过使用示例SQL查询的句法结构来检索演示示例,并选择同时追求多样性和相似性的示例可以提高性能&…...

双非本科准备秋招(19.2)—— 设计模式之保护式暂停
一、wait & notify wait能让线程进入waiting状态,这时候就需要比较一下和sleep的区别了。 sleep vs wait 1) sleep 是 Thread 方法,而 wait 是 Object 的方法 2) sleep 不需要强制和 synchronized 配合使用,但 wait 强制和 s…...

使用SpringMVC实现功能
目录 一、计算器 1、前端页面 2、服务器处理请求 3、效果 二、用户登陆系统 1、前端页面 (1)登陆页面 (2)欢迎页面 2、前端页面发送请求--服务器处理请求 3、效果 三、留言板 1、前端页面 2、前端页面发送请求 &…...

spring aop实现接口超时处理组件
文章目录 实现思路实现代码starter组件 实现思路 这里使用FutureTask,它通过get方法以阻塞的方式获取执行结果,并设定超时时间: public V get() throws InterruptedException, ExecutionException ;public V get(long timeout, TimeUnit un…...

c++设计模式之装饰器模式
作用 为现有类增加功能 案例说明 class Car { public:virtual void show()0; };class Bmw:public Car { public:void show(){cout<<"宝马汽车>>"<<endl;} };class Audi:public Car { public:void show(){cout<<"奥迪汽车>>&q…...

WordPress如何实现随机显示一句话经典语录?怎么添加到评论框中?
我们在一些WordPress网站的顶部或侧边栏或评论框中,经常看到会随机显示一句经典语录,他们是怎么实现的呢? 其实,boke112百科前面跟大家分享的『WordPress集成一言(Hitokoto)API经典语句功能』一文中就提供…...

【退役之重学前端】vite, vue3, vue-router, vuex, ES6学习日记
学习使用vitevue3的所遇问题总结(2024年2月1日) 组件中使用<script>标签忘记加 setup 这会导致Navbar 没有暴露出来,导致使用不了,出现以下报错 这是因为,如果不用setup,就得使用 export default…...

[linux]-总线,设备,驱动,dts
1. 总线BUS 在物理层面上,代表不同的工作时序和电平特性: 总线代表着同类设备需要共同遵守的工作时序,不同的总线对于物理电平的要求是不一样的,对于每个比特的电平维持宽度也是不一样,而总线上传递的命令也会有自己…...

python3实现gitlab备份文件上传腾讯云COS
gitlab备份文件上传腾讯云COS 脚本说明脚本名称:upload.py 假设gitlab备份文件目录:/opt/gitlab/backups gitlab备份文件格式:1706922037_2024_02_06_14.2.1_gitlab_backup.tar1.脚本需和gitlab备份文件同级目录 2.根据备份文件中的日期判断…...

292.Nim游戏
桌子上有一堆石头。 轮流进行自己的回合, 你作为先手 。 每一回合,轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可…...

Spring和Spring Boot的区别
Spring 是一个轻量级的 Java 开发框架,它提供了一系列的模块和功能,例如 IoC(控制反转)、AOP(面向方面编程)、数据库访问、Web 开发等。Spring 的目标是使 Java 开发更加简单、高效和可维护。 Spring Boot …...

备战蓝桥杯---动态规划(理论基础)
目录 动态规划的概念: 解决多阶段决策过程最优化的一种方法 阶段: 状态: 决策: 策略: 状态转移方程: 适用的基本条件 1.具有相同的子问题 2.满足最优子结构 3.满足无后效性 动态规划的实现方式…...