c++ STL--容器 (第二部分)

c++ STL–容器 (第二部分)

1.vector向量(序列性容器)

1.特点:

​ 数据的存储访问比较方便,可以像数组一阿姨那个使用[index]访问或修改值,适用于对元素修改和查看比较多的情况,对于insert或erase比较多的操作,很影响效率,不建议使用vector

2.使用的头文件为

#include <vector>
using namespace std;//需要打开std命名空间

3.关于vector容器一些功能的使用

我们用模版T实例化为int类型的vector来进行功能的测试

1.创建vector

vector<int> vec;//空的向量
vector<int> vec2(2);//构建了容量和使用量,并使用默认的初始化值,这里容量和使用量都是2
vector<int> vec3(2,3);//构建了容量和使用量,并指定了初始化值,这里容量和使用量都是2,初始值为3
vector<int> vec4{ 1,2,3,4 };//使用初始化列表,进行构建 这里容量和使用量都是4int arr[5] = { 5,6,7,8,9 };//通过连续的空间(比如数组)进行构建向量
vector<int> vec5(arr, arr + 3);//左闭右开

2.容量,使用量

cout << vec2.capacity() << "   " << vec2.size() << endl;//输出容量 使用量

3.遍历

1.迭代器遍历
vector<int>::iterator ite = vec4.begin();while (ite != vec4.end()) {cout << *ite << "   ";ite++;}cout << endl;
2.范围遍历
for (int v : vec5) cout << v << "   ";

4.vector的尾添加和尾删除

注意:当容量不够时,容量是以1.5倍扩容
vec5.push_back(7);//尾添加
vec5.pop_back();//尾删除

5.vector的插入和删除

注意:当容量不够时,容量是以1.5倍扩容
ite = vec5.begin();
vec5.insert(ite, 4);//在指向位置之前添加ite += 2;//此迭代器支持+=
ite=vec5.erase(ite);//删除时,迭代器会失效,可以接一下返回值,返回的是删除的下一个的迭代器

5.vector的清空

vec.clear();// //使用量为0,容量不变,相当于是把矿泉水倒没了,瓶子还在

6.重新设定一个使用量

vec.resize(3);//重新设定使用量,如果新设定的使用量小于容量,那么容量不会受影响,如果超过了容量,会导致扩容

7.交换两个向量

vec.swap(vec2);//可以用此方法来清空向量(容量和使用量均为0)
vector<int>().swap(vec);//这里是把已存在的向量和创建的临时变量(使用量和容量均为0)进行交换

8.将容量缩小到和使用量大小一样

vec3.shrink_to_fit();

2.list与vector的对比

1.vector是连续性空间,顺序存储,list链式结构体,链式存储

2.vector在非尾部插入,删除节点会导致其他元素的拷贝移动,list则不会影响其他节点元素

3.vector一次性分配好内存,使用量不够时,申请内存重新分配。list每次插入新节点时都会申请内存

4.vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好

5.vector具有容量和使用量的概念,而list只有使用量(即长度)概念

3.deque双端队列(序列性容器)

1.特点:

​ deque是一种双向开口的连续性空间,可以在头尾两端分别做元素的插入和删除操作-

2.使用的头文件为

#include <deque>
using namespace std;//需要打开std命名空间

3.关于deque容器一些功能的使用

我们用模版T实例化为int类型的deque来进行功能的测试

1.创建deque

deque<int> de{ 1,2,3,4 };//使用初始化列表

2.头添加,尾添加,获取长度

de.push_front(0);//头添加
de.push_back(5);//尾添加
cout << de.size() << endl;//输出长度

3.遍历

1.迭代器
deque<int>::iterator ite = de.begin();
while (ite != de.end()) {cout << *ite << "   ";ite+=1;	
}
2.范围遍历
for (int v : de) {cout << v << "   ";
}

4.通过下标访问元素

for (int i = 0; i < de.size(); i += 1) {cout << de[i] << "   ";//通过下标访问元素
}

4.map映射表(关联性容器)

1.特点

所有元素都会根据元素的键值自动排序,map的所有元素都是pair,同时拥有键值和实值。不允许两个元素拥有相同的键值,map的键值关系到map元素的排列规则,任意改变map元素键值将严重破环map的组织,所以不可以通过map的迭代器来改变map的键值,但是可以通过迭代器来改变元素的实值

查找效率:O(log2(n)),内部实现红黑树

2.使用的头文件为

#include <map>
using namespace std;//需要打开std命名空间

3.关于map容器一些功能的使用

我们用模版T实例化为(char,int)类型的map来进行功能的测试

1.创建map

map<char, int> m1{ {'r',1},{'q',2}};//使用初始化列表
m1['a'] = 3;//[]里是键值,=右边的是实值

2.遍历

1.迭代器
map<char, int>::iterator ite = m1.begin();
while (ite != m1.end()) {cout << ite->first << "-" << ite->second << endl;ite++;	
}
2.范围遍历
for (pair<char, int> v : m1) {cout << v.first << "-" << v.second<<"   ";
}

3.元素的插入

m1.insert(pair<char, int>('b', 4));
//如果键值存在,则插入失败,可通过bool判断,返回的迭代器指向的是原有键值的元素//此函数的返回值为pair<迭代器,bool>,我们接一下,看一下它的bool返回值
pair<map<char, int>::iterator, bool> pr = m1.insert(pair<char, int>('b', 5));
cout << "bool =" << pr.second << endl;//bool = 0
cout << pr.first->first << "-" << pr.first->second << endl;//返回的迭代器指向的是原有键值的元素

4.元素的删除

ite = m1.begin();
ite = m1.erase(ite);//可以用迭代器接一下返回值,防止迭代器失效

5.元素的查找

ite = m1.find('r');//通过键值找,没找到返回的是无效的那个元素( m1.end() )

6.upper_bound(返回大于某键值的map的迭代器),lower_bound(返回大于等于某键值的map的迭代器)

ite = m1.upper_bound('c');//返回大于该键值的map的迭代器
ite = m1.lower_bound('c');//返回大于等于该键值的map的迭代器//可以根据这种方法判断键值是否存在
char c = 'i';
if (m1.upper_bound(c) != m1.lower_bound(c)) {cout << "键值存在" << endl;
}
else {cout << "键值不存在" << endl;
}

5.set集合(关联性容器)

1.特点

所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有键值和实值,set元素的键值就是实值,实值就是键值,不允许两个元素拥有相同的键值,因为set的元素值就是其键值,关系到set元素的排列规则,任意改变set元素值将严重破环set的组织

查找效率O(log2(n)),内部实现红黑树

2.使用的头文件为

#include <unordered_map>
using namespace std;//需要打开std命名空间

3.关于set容器一些功能的使用

我们用模版T实例化为int类型的set来进行功能的测试

1.创建set

set<int> st{4,2,6,0};//使用初始化列表

2.遍历

1.迭代器
set<int> ::iterator ite = st.begin();
while (ite != st.end()) {cout << *ite<< endl;ite++;	
}
2.范围遍历
for (int v : m1) {cout << v <<"   ";
}

3.set的插入

st.insert(4);
//如果键值存在,则插入失败,可通过bool判断,返回的迭代器指向的是原有键值的元素

4.set的删除

ite = st.begin();
ite = st.erase(ite);//可以用迭代器接一下返回值,防止迭代器失效

5.hash_map哈希表(关联性容器)

1.特点

基于hashTable(哈希表),数据的存储和查找效率非常高,几乎可以看作常量时间,相应的代价是消耗更多的内存,使用一个较大的数组来存储空间,经过计算,使得每个元素与数组下标有唯一的对应关系,查找时直接定位

查找效率O(1)

无序

2.使用的头文件为

#include <unordered_map>
using namespace std;//需要打开std命名空间

3.关于hash_map容器一些功能的使用

我们用模版T实例化为(char,int)类型的hash_map来进行功能的测试

1.创建hash_map

unorder_map<char, int> m1{ {'r',1},{'q',2}};//使用初始化列表
m1['a'] = 3;//[]里是键值,=右边的是实值

2.遍历

1.迭代器
unorder_map<char, int>::iterator ite = m1.begin();
while (ite != m1.end()) {cout << ite->first << "-" << ite->second << endl;ite++;	
}
2.范围遍历
for (pair<char, int> v : m1) {cout << v.first << "-" << v.second<<"   ";
}

3.元素的插入

m1.insert(pair<char, int>('b', 4));
//如果键值存在,则插入失败,可通过bool判断,返回的迭代器指向的是原有键值的元素

4.元素的删除

ite = m1.begin();
ite = m1.erase(ite);//可以用迭代器接一下返回值,防止迭代器失效

5.元素的查找

ite = m1.find('r');//通过键值找,没找到返回的是无效的那个元素( m1.end() )

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

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

相关文章

数据库--MySQL

一、什么是范式&#xff1f; 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF)&#xff1a;满足…

代码随想录day03

链表理论基础 ● 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点有两个部分&#xff0c;数据域和指针域&#xff0c;最后一个节点指针域指向null 链表类型 ● 单链表 ● 双链表 ○ 每个节点有两个指针域&#xff0c;一个指向下一个节点&#xff0c;一个是上…

企业级帮助中心编写方案怎么写?

在现代商业环境中&#xff0c;为客户提供高效的支持和解决方案至关重要。企业级帮助中心是一个集中管理和呈现常见问题和解答的平台&#xff0c;可以为客户提供快速、便捷的自助帮助。本文将提供一个企业级帮助中心编写方案&#xff0c;旨在帮助企业提供优质的客户支持&#xf…

【ARM 嵌入式 编译系列 3.1 -- GCC __attribute__((used)) 使用】

文章目录 __attribute__((used)) 属性介绍代码演示编译与输出GCC 编译选项 上篇文章&#xff1a;ARM 嵌入式 编译系列 3 – GCC attribute((weak)) 弱符号使用 下篇文章&#xff1a;ARM 嵌入式 编译系列 3.2 – glibc 学习 __attribute__((used)) 属性介绍 在普通的 C/C 程序中…

20.4 HTML 表单

1. form表单 <form>标签: 用于创建一个表单, 通过表单, 用户可以向网站提交数据. 表单可以包含文本输入字段, 复选框, 单选按钮, 下拉列表, 提交按钮等等. 当用户提交表单时, 表单数据会发送到服务器进行处理.action属性: 应指向一个能够处理表单数据的服务器端脚本或UR…

在SpringBoot项目中使用线程池创建一个线程案例

目录 1. 首先,在你的Spring Boot项目的配置类中,创建一个`ThreadPoolTaskExecutor`的Bean:2. 在你的Service类中,创建一个异步方法,并使用`@Async`注解将其标记为异步方法,该方法将在线程池中执行:3. 在Controller中调用异步方法:在Spring Boot项目中使用线程池可以通过…

React入门学习笔记3

事件处理 通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件——为了更好的兼容性 eg&#xff1a;οnclick》onClickReact中的事件是通过事件委托方式处理的(委托给组件最外层的元素)——为了更高效通过event.target得到发生…

【Express.js】软件测试

软件测试 本节介绍如何在 express.js 使用 Jest 进行单元测试 准备工作 准备一个基础的 express 项目&#xff0c;本文基于 evp-express-cli安装 Jest npm install jest --save-dev生成 Jest 配置 npx jest --init编写测试 创建测试文件&#xff0c;以 .test.js 后缀命名…

AlmaLinux 9 安装 Go 1.20

AlmaLinux 9 安装 Golang 1.20 1. 下载 go 安装包2. 安装 go3. 配置环境变量4. 确认 go 版本 1. 下载 go 安装包 访问 https://go.dev/dl/&#xff0c;下载你想安装的版本&#xff0c;比如 go1.20.7.linux-amd64.tar.gz&#xff0c; 2. 安装 go (可选)删除旧版本&#xff0c;…

CLIP论文精度

CLIP论文精度 Zero-shot CLIP多模态模型 Image Endecoder是一个图片编码器&#xff0c;既可以是ResNet,也可以是Vision Transformer. Text Encoder和Image Encoder产生的两组特征进行对比学习&#xff08;无监督训练&#xff09; 分类头&#xff1f;“分类头” 是指网络结…

matlab使用教程(13)—稀疏矩阵创建和使用

使用稀疏矩阵存储包含众多零值元素的数据&#xff0c;可以节省大量内存并加快该数据的处理速度。sparse 是一种属性&#xff0c;可以将该属性分配给由 double 或 logical 元素组成的任何二维 MATLAB 矩阵。通过 sparse 属性&#xff0c;MATLAB 可以&#xff1a; • 仅存储矩…

openGauss学习笔记-37 openGauss 高级数据管理-事务

文章目录 openGauss学习笔记-37 openGauss 高级数据管理-事务37.1 语法格式37.2 参数说明37.3 示例 openGauss学习笔记-37 openGauss 高级数据管理-事务 事务是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做要么全不做&#xff0c;是一个不可分割的工作单位。ope…

SpringBoot案例-部门管理-删除

目录 查看页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文档 思路分析 功能接口开发 控制层&#xff08;Controllre类&#xff09; 业务层&#xff08;Service类&#xff09; 持久层&#xff08;Mapper类&#xff09; 接口测试 前后端联调 查看页面原型&a…

全面讲解|DCMM数据管理能力成熟度及各地政策汇总

信息技术与经济社会的交汇融合引发了数据爆发式增长。数据蕴含着重要的价值&#xff0c;已成为国家基础性战略资源&#xff0c;正日益对全球生产、流通、分配、消费活动以及经济运行机制、社会生活方式和国家治理能力产生重要影响。数据价值发挥的前提是管理好数据&#xff0c;…

docker 学习笔记 (持续更新)

一些基础概念 Docker 入门教程 - 阮一峰的网络日志 什么是image文件&#xff1f; Docker 把应用程序及其依赖&#xff0c;打包在 image 文件里面。只有通过这个文件&#xff0c;才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。…

13_Ansible role、创建目录结构、Roles依赖关系;Playbook参考资料:facts、with_item、jinja模板、role角色

16.Ansible role 16.1.Ansible Roles介绍 16.2.创建目录结构 16.3.Ansible Roles依赖关系 17.其它参考资料 17.1.Playbook参考资料 17.2.Ansible facts 17.3.判断语句 when 17.4.with_items 17.5.ansible jinja模板 17.6.ansible role角色 17.7.变量其它参考文档 16.Ansible r…

【Codeforces】 CF1734E Rectangular Congruence

题目链接 CF方向 Luogu方向 题目解法 暂时不考虑 b i b_i bi​ 的限制 考虑构造 a i , j i j a_{i,j}ij ai,j​ij&#xff0c; 那么 a r 1 , c 1 a r 2 , c 2 r 1 c 1 r 2 c 2 , a r 1 , c 2 a r 1 , c 2 r 1 c 2 r 2 c 1 a_{r1,c1}a_{r2,c2}r1c1r2c2,\;a_{r1,c2}…

设计模式(5)代理模式

一、介绍&#xff1a; 【Subject/抽象角色】定义了RealSubject和Proxy的共用接口&#xff0c;这样就可以在任何使用RealSubject的地方都可以使用Proxy 【RealSubject/真实角色】定义Proxy所代表的真实实体 【Proxy/代理角色】保存一个引用使得代理可以访问实体&#xff0c;并…

题目:2319.判断矩阵是否是 X 矩阵

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2319. 判断矩阵是否是一个 X 矩阵 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 遍历矩阵&#xff0c;对于每一个节点&#xff0c;先判断是否处于主对角线或副对角线上&#xff0c;然后判…