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::vectorx中的元素进行初始化
| 构造函数声明 | 接口说明 |
|---|---|
| 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…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”
深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀” 在JavaScript中,我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时,单纯依赖字符串或数组就显得力不从心了。这时ÿ…...
MySQL基本操作(续)
第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...
机器学习复习3--模型评估
误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为:误差(error)。 误差定义: ①在训练集上的误差称为训练误差(training error)或经验误差(empirical error&#x…...
