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

文章目录

    • 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() 生成函数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

buctoj——2024寒假集训 进阶训练赛 (五)

问题 A: 约瑟夫问题 题目描述 N个人围成一圈&#xff0c;从第一个人开始报数&#xff0c;数到M的人出圈&#xff1b;再由下一个人开始报数&#xff0c;数到M的人出圈&#xff1b;……输出依次出圈的人的编号。N&#xff0c;M由键盘输入。 输入 一行&#xff0c;包含两个正整数…

Linux 入门命令大全汇总 + Linux 集锦大全 【20240122】

文章目录 Linux 入门命令大全汇总Linux 集锦大全更多信息 Linux 入门命令大全汇总 别有一番风趣的alias 刚刚好合适的 apropos 命令 迷你计算器 bc 可看黄道吉日的 cal 全文可查看&#xff1a; Linux入门命令大全全文 Linux 集锦大全 linux终端中最漂亮的几款字体介绍及…

golang学习笔记——http.Handle和http.HandleFunc的区别与type func巧妙运用

文章目录 http.Handle和http.HandleFunc的区别http.Handle分析type func巧妙运用 http.HandleFunc分析总结参考资料 http.Handle和http.HandleFunc的区别 http.Handle和http.HandleFunc的区别体现了Go语言接口的巧妙运用 下面代码启动了一个 http 服务器&#xff0c;监听 808…

深入理解C语言(2):字符、字符串与内存函数

文章主题&#xff1a;字符、字符串与内存函数&#x1f30f;所属专栏&#xff1a;深入理解C语言&#x1f4d4;作者简介&#xff1a;更新有关深入理解C语言知识的博主一枚&#xff0c;记录分享自己对C语言的深入解读。&#x1f606;个人主页&#xff1a;[₽]的个人主页&#x1f3…

jdk17新特性——Switch表达式增强

目录 一、Switch表达式增强示例一1.1、传统的方式 case中变量赋值示例1.2、jdk17 case中变量赋值示例 二、Switch表达式增强示例二2.1、传统的方式 case中值匹配多个示例2.2、jdk17 case中值匹配多个示例 三、Switch表达式增强示例三3.1、传统的方式 case中需要多行业务代码示例…

React-Native项目矢量图标库(react-native-vector-icons)

系列文章目录 React-Native环境搭建&#xff08;IOS&#xff09;React-Native项目 — 关于IOS知识储备React-Native项目工程搭建&#xff08;开发模板搭建&#xff09;React-Native项目矢量图标库&#xff08;react-native-vector-icons&#xff09; 目录 系列文章目录前言一、…

斐波那契查找

斐波那契查找 概述步骤代码示例输出结果 概述 斐波那契查找是一种基于斐波那契数列的查找算法&#xff0c;用于在有序数组中查找目标元素的位置。与二分查找类似&#xff0c;斐波那契查找也是一种分治算法&#xff0c;它通过比较目标值与数组的中间元素来确定下一步的查找范围…

C++版QT:鼠标事件

鼠标常用的事件可以说有一下几种&#xff1a;鼠标按下、鼠标移动、鼠标移动、鼠标双击和鼠标滚轮事件。 当你想使用他们&#xff0c;需要包含头文件&#xff1a;#include <QMouseEvent> 需要对鼠标事件进行处理时&#xff0c;通常要重新实现以下几个鼠标事件处理函数&a…

设备对象(DEVICE_OBJECT)

设备对象(DEVICE_OBJECT) 每个驱动程序会创建一个或多个设备对象&#xff0c;用DEVICE_OBJECT数据结构表示。每个设备对象都会有一个指针指向下一个设备对象&#xff0c;因此就形成一个设备链。设备对象链的第一个设备是由DRIVER_OBJECT结构体中指明的。设备对象保存设…

UI自动化中的option选项配置

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

《WebKit 技术内幕》学习之七(2): 渲染基础

2 网页层次和RenderLayer树 2.1 层次和RenderLayer对象 前面章节介绍了网页的层次结构&#xff0c;也就是说网页是可以分层的&#xff0c;这有两点原因&#xff0c;一是为了方便网页开发者开发网页并设置网页的层次&#xff0c;二是为了WebKit处理上的便利&#xff0c;也就是…

C++中命名空间、缺省参数、函数重载

目录 1.命名空间 2.缺省参数 3.函数重载 1.命名空间 在C中定义命名空间我们需要用到namespace关键字&#xff0c;后面跟上命名空间的名字&#xff0c;结构框架有点类似结构体&#xff08;如图所示&#xff09; 上面的代码我一一进行讲解&#xff1a; 1.我们先来说第三行和main函…

开源堡垒机JumpServer本地安装并配置公网访问地址

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

基于CLIP4Clip的DRL的WTI模块实现

关于DRL的WTI模块&#xff1a; Weighted Token-wise Interaction&#xff1a; 直觉上&#xff0c;并非所有的单词和视频帧都同等重要。我们提供一种自适应方法&#xff0c;来调整每个标记的权重大小&#xff1a; 注&#xff1a;其中两个f函数都是MLP和softmax构成。 WTI的算…

使用STM32的SPI接口实现与外部传感器的数据交互

一、引言 外部传感器是嵌入式系统中常用的外设&#xff0c;用于检测环境参数、采集数据等。通过STM32微控制器的SPI接口&#xff0c;可以与外部传感器进行数据交互&#xff0c;从而实现数据的采集和控制。本文将介绍如何使用STM32的SPI接口实现与外部传感器的数据交互&#xff…

云计算任务调度仿真05

今天再分享一个新的调度框架deeprm 本项目基于hongzimao/deeprm&#xff0c;原作者还著有论文Resource Management with Deep Reinforcement Learning 。 这个框架研究的也蛮多的&#xff0c;我在一篇博士论文中也看到了基于此的研究工作&#xff0c;但是论文题目忘记了。 运…

【C++】入门(一)

前言&#xff1a; 本篇博客将带大家认识C&#xff0c;熟悉基本语法 文章目录 认识CC的诞生与发展C 在行业中的运用 一、命名空间1.1 命名空间的定义1.2 命名空间的使用1.3 命名空间的访问 二、C输入&输出输出操作符 <<输入操作符 >>换行符和刷新输出缓冲区关键…

如何在CentOS8使用宝塔面板本地部署Typecho个人网站并实现公网访问【内网穿透】

文章目录 前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 Typecho是由type和echo两个词合成的&#xff0c;来自于开发团队的头脑风暴。Typecho基于PHP5开发&#xff0c;支持多种数据库&#…

vmware 安装Rocky-9.3系统

安装系统截图 安装完成&#xff0c;启动 查看版本和内核 开启远程登陆授权 1、编辑配置文件 #提升权限&#xff0c;输入su,并输入密码 su #编辑ssh文件开启root远程登陆 vi /etc/ssh/sshd_config找到以下内容&#xff1a;#PermitRootLogin prohibit-password 添加&#xff1a…

C#winform上位机开发学习笔记5-串口助手的定时发送功能添加

1.功能描述 选择自动发送功能后&#xff0c;按照设定的发送时间发送发送框中的信息数据&#xff0c;设定时间可以手动输入&#xff0c;当手动输入信息无效&#xff08;非数字&#xff09;时&#xff0c;系统弹出错误提示&#xff0c;并将其设置为默认定时时间。 2.代码部分 步…