【算法竞赛C++STL基础】栈,链表,队列,优先队列,map,set以及迭代器的用法

news2024/11/16 9:01:47

文章目录

    • 1,前知——模板函数的实现
    • 2, hash 表
      • 1,定义
      • 2,ASCII码表
      • 3,咉射关系
    • 3,迭代器
    • 4,STL关系
      • 1,stl 的基础关系
      • 2,stl 的分类
        • 1,相关分类
        • 2,相关简介
          • 顺序容器
          • 关联容器
          • 适配容器
      • 3. STL 的相关函数的学习
        • 3.1 STL函数中都含有的性质
        • 3.2 `vector`,`deque`,`list` 三个容器中的特殊成员函数
          • 1,迭代器
          • 2.顺序容器的基础函数
          • 3. 顺序函数的高级函数
        • 3.3 关联容器(QS: 我习惯称之为 hash类容器 )
        • 1,Map/Multimap 的容器 (现在来说的话我们一般不会使用到multimap 和unordered_map,先留下位置以后再说)
          • 1, 创建容器
          • 2.基础函数
        • 2,Set集合容器的常见函数
        • 3,适配器容器 stack , queue , priority_queue
        • 4. pair <>

1,前知——模板函数的实现

函数模板的实现

template
T min (T a[] , int n ){

}

// 函数模板大致的书写方式,实际上就是多了个 template < class T > // 把 T 当成万能的数据结构




template <class T>
T min (T a[] , int n ){
    T minv = a[0] ;
    for(int i = 1 ; i < n ; i ++ ){
        minv = min(minv,a[i]) ; 
    }
    return minv;
}

2, hash 表

1,定义

哈希表实际上就是一种简单的映射关系,就和桶排序一样的效果,当前他一般只咉射到ASCII表的范围内,在范围外的咉射一般来说不是很好实现。

2,ASCII码表

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

记住几个重要的点 :

48 - 0 / / 9

65 - A // 25

97 - a // 25

3,咉射关系

#include <iostream>
using namespace std ;
const int N = 256 ; // 2的八次方
int hash[N] ; 
int main () {
    // hash[i] ++ ; 
    return 0 ; 
}



3,迭代器

#####在这里插入图片描述

在这里插入图片描述




4,STL关系

1,stl 的基础关系

o容器:可容纳各种数据类型的数据结构。

o迭代器:可依次存取容器中元素的东西 // 相当于数组的下标

泛化 :

一般来说容器中的迭代器为 vec.begin() , vec.end() | 数组中的迭代器为 q , q + n

迭代器中的差值一般是顺序存储的,插值个数 = 中间的个数

// 迭代器的存储 : iterator 变量名

o算法:用来操作容器中的元素的函数模板。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。n函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。



2,stl 的分类

1,相关分类
  1. 顺序容器

vector:后部插入/删除,直接访问
deque:前/后部插入/删除,直接访问
list:双向链表,任意位置插入/删除

  1. 关联容器

set:快速查找,无重复元素
multiset :快速查找,可有重复元素
map:一对一映射,无重复元素,基于关键字查找
multimap :一对一映射,可有重复元素,基于关键字查找

前2者合称为第一类容器

  1. 容器适配器

stack:LIFO
queue:FIFO
priority_queue:优先级高的元素先出


2,相关简介
顺序容器
  1. vector 头文件

实际上就是个动态数组。随机存取任何元素都能在常数时间完成O(1)。在尾端增删元素具有较佳的性能O(1)。

  1. deque 头文件

也是个动态数组,随机存取任何元素都能在常数时间完成(但性能次于vector,常数较大)。在两端增删元素具有较佳的性能O(1)。

  1. list 头文件

双向链表,在任何位置增删元素都能在常数时间完成O(N)。不支持随机存取。

上述三种容器称为顺序容器,是因为元素的插入位置同元素的值无关,只跟插入的时机有关。

关联容器
  1. set/multiset: 头文件

set 即集合。set中不允许相同元素,multiset中允许存在相同的元素。

  1. map/multimap: 头文件

map与set的不同在于map中存放的是成对的key/value。

并根据key对元素进行排序,可快速地根据key来检索元素

map同multimap的不同在于是否允许多个元素有相同的key值。

上述4种容器通常以平衡二叉树方式实现,插入、查找和删除的时间都是 O(logN)

适配容器
  1. stack :头文件

栈。是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项。即按照后进先出的原则 O(1)

  1. queue :头文件

队列。插入只可以在尾部进行,删除、检索和修改只允许从头部进行。按照先进先出的原则。O(1)

  1. priority_queue :头文件

优先级队列。最高优先级元素总是第一个出列,O(logN)



3. STL 的相关函数的学习

3.1 STL函数中都含有的性质
  1. .empty() // 判断是否为空 为空 == true
  2. size() // 返回最多能放多少元素
  3. swap() // 交换两个容器中的内容


3.2 vector,deque,list 三个容器中的特殊成员函数
1,迭代器
  1. begin 返回指向容器中第一个元素的迭代器
  2. end 返回指向容器中最后一个元素后面的位置的迭代器
  3. rbegin 返回指向容器中最后一个元素的迭代器
  4. rend 返回指向容器中第一个元素前面的位置的迭代器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


2.顺序容器的基础函数

n.front() :返回容器中第一个元素的引用

n.back() : 返回容器中最后一个元素的引用

n.push_front() : 在容器的前面加入新元素 // list + dequeue

n.pop_front() : 在容器的前面删除新元素 // list + dequeue

n.push_back(): 在容器末尾增加新元素

n.pop_back(): 删除容器末尾的元素

3. 顺序函数的高级函数

list函数

  1. ls.unique() ; // 能够去重与前面一致的元素
  2. ls.reverse() ; // 反转
  3. ls.remove(x) // 删除与目标值x相同的所有元素


3.3 关联容器(QS: 我习惯称之为 hash类容器 )
1,Map/Multimap 的容器 (现在来说的话我们一般不会使用到multimap 和unordered_map,先留下位置以后再说)
1, 创建容器
#include <map>
map < 键值 ,>  
2.基础函数
  1. insert():插入操作的平均时间复杂度是O(log n)。

  2. operator[]:下标操作符的时间复杂度是O(log n)。如果键不存在,它会插入一个新元素,此时时间复杂度与insert()相同话说 他其实就是insert,但是一般情况下我们选用这种方式更加简单 。 //当没有的时候

  3. clear():清除所有元素的时间复杂度是O(n),其中n是map中元素的数量。

  4. count():检查键是否存在的时间复杂度是O(log n)。

  5. empty():判断map是否为空的时间复杂度是O(1)。

  6. erase():删除一个元素的时间复杂度是O(log n)。

  7. find():查找一个键的时间复杂度是O(log n)。

2.cpp

#include <iostream>
#include <map>
using namespace std ;
map <string , int > mp ; 
int main () {
    // make_pair(键值 , 内容值 ) ;
    // mp.insert(pair<,>) ; 
	mp.insert(make_pair("apple", 2)) ; 
	cout << mp["apple"] << endl ; 
	return 0 ; 
}
2,Set集合容器的常见函数
  1. 插入 (set1.insert() ) : 把当前这个名称插入进当前集合 // O(log(N))
  2. 查找有没有当前的值 : .count()

需要注意的是,这些时间复杂度是在平均情况下给出的。在某些特定情况下(例如,当map需要进行大量重新平衡时),某些操作的时间复杂度可能会更高。此外,实际的性能还会受到其他因素的影响,如内存分配和缓存效率等。



3,适配器容器 stack , queue , priority_queue

stack :

push / pop / top

queue :

push / pop / front / back

priority_queue :

push / pop / top

4. pair <>

// make_pair() 生成函数

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

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

相关文章

vue项目编译非常慢,经常卡在某个百分点

1、注册插件 2、在项目根目录下的 babel.config.js 文件中加入下方配置 3、将import导入方式改为require导入方式&#xff0c;返回promise 4、如果动态加载组件import引入组件找不到组件&#xff08;Error: Cannot find module&#xff09; 使用 webpack 的 require.ensure() …

每天五分钟计算机视觉:掌握迁移学习使用技巧

本文重点 随着深度学习的发展,迁移学习已成为一种流行的机器学习方法,它能够将预训练模型应用于各种任务,从而实现快速模型训练和优化。然而,要想充分利用迁移学习的优势,我们需要掌握一些关键技巧。本文将介绍这些技巧,帮助您更好地应用迁移学习技术。 迁移学习的关键…

UG制图-视图与投影

当我们进入图纸页后&#xff0c;我们需要对产品进行投影然后进行标注 注意&#xff1a;如果是从零件3D中直接进入制图&#xff0c;默认情况下图框所在的图层是不显示的&#xff0c;我们可以通过菜单或者快捷键ctrl L进入图层设置模块&#xff0c;将图层170和173勾选为显示 我…

MySQL JSON数据类型

在日常开发中&#xff0c;我们经常会在 MySQL 中使用 JSON 字段&#xff0c;比如很多表中都有 extra 字段&#xff0c;用来记录一些特殊字段&#xff0c;通过这种方式不需要更改表结构&#xff0c;使用相对灵活。 目前对于 JSON 字段的实践各个项目不尽相同&#xff0c;MySQL 表…

SpringCloud Alibaba 深入源码 - Nacos 分级存储模型、支撑百万服务注册压力、解决并发读写问题(CopyOnWrite)

目录 一、SpringCloudAlibaba 源码分析 1.1、SpringCloud & SpringCloudAlibaba 常用组件 1.2、Nacos的服务注册表结构是怎样的&#xff1f; 1.2.1、Nacos的分级存储模型&#xff08;理论层&#xff09; 1.2.2、Nacos 源码启动&#xff08;准备工作&#xff09; 1.2.…

windows11上安装虚拟机VMware

1、安装虚拟机&#xff08;待补充&#xff09; 第二步&#xff1a;安装VMware tools 实现windows文件上传到虚拟机中 1、安装好虚拟机后&#xff0c;查看虚拟机ip用Xshell连接虚拟机&#xff0c;并安装VMware tools(只有安装了VMware tools才能实现虚拟机和本机的文件共享。在…

P4学习(六)实验三:a Control Plane using P4Runtime

目录 一. 实验目的二.阅读MyController.py文件1.导入P4Runtime的库2.main部分1. P4InfoHelper 实例化2. 创建交换机连接3. 设置主控制器4. 安装 P4 程序5. 写入隧道规则6. 读取表项和计数器&#xff08;注释掉的部分&#xff09;7. 定时打印隧道计数器8. 异常处理9. 关闭交换机…

动态规划系列问题之打家劫舍和买股票

动态规划系列问题 1.打家劫舍问题1.1打家劫舍I1.2打家劫舍II1.3打家劫舍III 2.买股票问题2.1买股票的最佳时机2.2买股票的最佳时机II2.3买股票的最佳时机III2.4买股票的最佳时机IV2.5买卖股票的最佳时机含冷冻期2.6买卖股票的最佳时机含手续费 题目解析参考了代码随想录 https:…

【Redis漏洞利用总结】

前言 redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。Redis默认使用 6379 端口。 一、redis未授权访问漏洞 0x01 漏洞描述 描述: Redis是一套开源的使用ANSI C编写、支持网络、可基于内存…

基于深度学习的交通标志检测和识别(从原理-环境配置-代码运行)

基于深度学习的交通标志检测和识别是一种先进的计算机视觉技术&#xff0c;利用深度神经网络模型来准确地检测和识别道路上的各种交通标志。下面是对其介绍并分点阐述其重要性和应用场景&#xff1a; 1. 深度学习技术&#xff1a; 交通标志检测和识别利用深度学习技术&#x…

笔试面试题——二叉树进阶(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、二叉搜索树与双向链表1、题目讲解2、思路讲解递归展开图3、代码实现 二、从前序遍历和中序…

刷题 ------ 排序

文章目录 1.K 次取返后最大化的数组和&#xff08;堆&#xff09;2.数组的相对排序&#xff08;桶&#xff09;3.最小绝对差4.根据数字二进制下1的数目排序&#xff08;qsort&#xff09;5.有多少小于当前数字的数字6.非递增顺序的最小子序列7.按照频率将数组升序排序&#xff…

unity 2021 发布安卓版本,谷歌限流国内,报错CommandInvokationFailure: Gradle build failed

在使用 Unity 2022 打包安卓项目时&#xff0c;遇到 gradle 无法访问或下载超级慢最终超时出错的问题解决 解决方案&#xff1a; 1. 在 Build Settings 左下角打开 Player Settings&#xff0c;在 Android 平台图标选项卡下找到 Publishing Settings 区域 勾选 2. 从国内…

​《WebKit 技术内幕》学习之九(3): JavaScript引擎

3 JavaScriptCore引擎 3.1 原理 JavaScriptCore引擎是WebKit中的默认JavaScript引擎&#xff0c;也是苹果在开源WebKit项目之后&#xff0c;开源的另外一个重要的项目。同其他很多引擎一样&#xff0c;在刚开始的时候它的主要部分是一个基于抽象语法树的解释器&#xff0c;这…

【数据库原理】(38)数据仓库

数据仓库&#xff08;Data Warehouse, DW&#xff09;是为了满足企业决策分析需求而设计的数据环境&#xff0c;它与传统数据库有明显的不同。 一.数据库仓库概述 定义: 数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持企业管理和…

成都爱尔胡建斌院长提醒视网膜脱离到底有多危险?!

视网膜脱离是视网膜神经上皮层与色素上皮层的分离。 视网膜脱离之危险&#xff0c;在与视网膜脱离后外层视网膜得不到脉络膜的血液供应&#xff0c;如不及时复位&#xff0c;视网膜感光细胞会发生凋亡&#xff0c;视力就不易恢复。 就症状来说&#xff0c;患者发病初期眼前多有…

0122-1-JavaScript高级程序设计11-27章

前言 通过阅读这本书写下的一些笔记 《JavaScript高级程序设计》 第11章——期约与异步函数 11.2 期约&#xff08;promise&#xff09;:是对 尚不存在结果 的一个替身。 /*** 期约与异步函数* 什么是Promise?* &#xff08;1&#xff09;从语法上来说&#xff1a;Promis…

np.argsort排序问题(关于位次)-含GitHub上在numpy项目下提问的回复-总结可行方案

np.argsort 与获取位相关问题 位次: 数组中的数据在其排序之后的另一个数组中的位置 [1,0,2,3] 中 0的位次是1 1的位次是2 2的位次是3 3的位次是4 这里先直接给出结论&#xff0c;np.argsort()返回的索引排序与实际位次在确实在某些情况下会出现一致&#xff0c;但后来numpy的开…

HubSpot SEO功能好用吗?

HubSpot对于SEO&#xff08;搜索引擎优化&#xff09;提供了全面的工具和功能&#xff0c;帮助用户优化其网站以在搜索引擎中取得更好的排名。以下是关于HubSpot SEO的一些关键方面&#xff1a; 内容优化&#xff1a; HubSpot的内容工具允许用户创建并优化吸引人的内容。通过关…

pikachu验证码绕过第三关攻略

打开pikachu靶场第三关&#xff1a; 挂上代理&#xff0c;随便输入账户密码&#xff1a; 返回bp。进行放包发现显示token错误。 每一次登录的返回包会带有token相关数据用于下一次的登录认证&#xff1a; 进行替换token值&#xff1a; 替换完成开始进行检点的爆破&#xff1a;…