(蓝桥杯C/C++)——STL(下)

目录

一、list

1.list的定义与结构

2.list的常用函数

二、set

1.set集合

         2.multiset多重集合

        3.unordered set无序集合

三、queue

1.queue队列

priority_queue优先队列

3.deque双端队列


一、list

1.list的定义与结构

list的使用频率不高,在做题时极少遇到需要使用list的情景list是一种双向链表容器,它是标准模板库(STL)提供的一种序列容器list容器以节点(node)的形式存储元素,并使用指针将这些节点链接在一起,形成一个链表结构。

list容器的定义和结构如下:

template<class T,class Allocator = std::allocator<T>>

class list;

ist容器模板接受两个参数:

1.T:指定容器中存储的元素类型

2.Allocator(可选):指定用于分配内存的分配器类型,默认为std:allocator<T>。

list容器的特点包括:·

双向性:每个节点都包含指向前一个节点和后一个节点的指针,因此可以在常数时间内在链表中的任意位置进行插入、删除和访问操作。

动态大小:链表的大小可以根据需要动态扩展或收缩,不需要预先指定容器的大小

不连续存储:链表中的节点可以在内存中的任意位置分布,不要求连续存因此插入和删除操作不会导致元素的移动。list容器提供了一系列成员函数和迭代器来操作和访问链表中的元素,包删除、访问、反转等操作。可以使用迭代器来遍历链表中的元素

list的使用频率不高,在做题时极少遇到需要使用list的情景。

list是一种双向链表容器,它是标准模板库(STL)提供的一种序列容器list容器以节点(node)的形式存储元素,并使用指将这些节点链接在一起,形成一个链表结构。

list容器的定义和结构如下:

template <class(T)class Allocator= std::allocator<T>>
class list;

以下是一个示例,展示如何使用list容器:
     #include <iostream>
     #include <list>

           int main()

   {
          std::list<int> mylist;
         //在链表尾部指入元素myList;

         myList.push back(1);

         myList.push back(2);

         myList.push_back(3);
       

         //在链表头部插入元素

         myList.push_ front(0);
        //历链表并输出元素
        for(int num: myList)

          {
               std::cout << num << " ";

          }
               std::cout << std::endl;
    return 0;

}


在上述示例中,我们首先创建了一个list容器myList,然后使用push back()和push front()函数分别在链表尾部和头部插入元素。最后,使用范围基于范围的for循环遍历链表并输出元素。需要注意的是,由于list是双向链表,因此插入和删除操作的时间复杂度是常量时间O(1),但访问和查找操作的时间复杂度是线性时间O(n),其中n是链表的大小。因此,如果需要频繁进行随机访问操作,可能更适合使用支持随机访问的容器,如vector或deque。

2.list的常用函数

list容器提供了多个常用的成员函数来操作和访问链表中的元素。以下是一些常用的list函数的解释:
1.push back(): 将元素插入到链表的末尾
2.push front():  将元素插入到链表的开头
3.pop_back():  移除链表末尾的元素
4.pop_front():  移除链表开头的元素。
5.size(): 返回链表中元素的个数。
6.empty(): 检查链表是否为空。

7.clear(): 清空链表中的所有元素

8.front():返回链表中第一个元素的引用。
9.back()返回链表中最后一个元素的引用。
10.begin(): 返回指向链表第一个元素的迭代器。
11.end(): 返回指向链表未尾的下一个位置的迭代器。
12.insert(): 在指定位置之前插入一个或多个元素

13.erase():从链表中移除指定位置的一个或多个元素

二、set

1.set集合

set是一种容器,用于存储一组唯一的元素,并按照一定的排序规则进行排序。set中的元素是按照升序排序的默认情况下,它使用元素的比较运算符(<)来进行排序。

set的定义和结构如下:

emplate   << class Key,class Compare  = less<Key>,
                class Allocator =  allocator<Key>>
class set;


·Key: 表示存储在set中的元素的类型。

·Compare: 表示元素之间的比较函数对象的类型,默认为less,即按照元素的值进行比较」

·Allocator: 表示用于分配内存的分配器类型,默认为allocator。set的内部实现使用了红黑树(一种自平衡的二叉搜索树)来存储元素,并保持元素的有序性这使得在set中插入、删除和查找元素的时间复杂度都是对数时间,即O(log n)。set中的元素是唯一的,即不允许重复的元素存在。当插入一个重复的元素时,set会自动忽略该元素。


 

函数
insert
erase
find
lower_bound

upper_bound

size

empty

clear

begin

end

rbegin

rend

描述
向集合中插入元素
从集合中移除元素
查找集合中的元素
返回第一个不小于给定值的迭代器

返回第一个大于给定值的的迭代器

返回一个范围,其中包含所有给定值的元素
返回集合中元素的数量
检查集合是否为空
清空集合

返回指向集合起始位置的迭代器
返回指向集合末尾位置的迭代器
返回指向集合末尾位置的逆向迭代器
返回指向集合起始位置的逆向迭代器

平均时间复杂度
O(log n)
O(log n)
O(log n)
O(log n)
O(log n)
O(1)
O(1)
O(n)

O(1)
O(1)

O(1)
O(1)

最坏时间复杂度

O(log n)
O(log n)
O(log n)
O(log n)
O(log n)
O(1)
O(1)
O(n)

O(1)
O(1)

O(1)
O(1)

set示例
#include<iostream>
#include <set>

using nanespace std;

struct MyCo
bool operator()(const int& aconst int系 b)const// 自宝义比较逻辑return a>b;// 改为送序
      int main()

    {
       set <int,  greater<int>> myset;
             mySet.insert(25);

             mySet.insert(17);

             mySet.insert(39);

             mySet.insert(42);

            for (const auto& elem : mySet)

                    {

                     cout << elem <<" ";

                   }

                  cout << endl;

                 return 0;

}

multiset示例

#include<iostream>
#include <set>

using nanespace std;

     struct MyCompare

     {

      bool operator()(const int& a,const int& b) const

         {

              //自定义比较逻辑

             return  a > b;  //改为逆序 

            }

};
          int main()

                {

                  set<int,  MyCompare> mySet;

                  

             mySet.insert(25);

             mySet.insert(17);

             mySet.insert(39);

             mySet.insert(42);


           for (const auto& elem : mySet)

       {

            cout << elem <<" ";

        }

     cout << endl;
return 0;

}


2.multiset多重集合

函数
insert
erase
find
lower_bound

upper_bound

size

empty

clear

begin

end

rbegin

rend

描述
向集合中插入元素
从集合中移除元素
查找集合中的元素
返回第一个不小于给定值的迭代器

返回第一个大于给定值的的迭代器

返回一个范围,其中包含所有给定值的元素
返回集合中元素的数量
检查集合是否为空
清空集合

返回指向集合起始位置的迭代器
返回指向集合末尾位置的迭代器
返回指向集合末尾位置的逆向迭代器
返回指向集合起始位置的逆向迭代器

平均时间复杂度
O(log n)
O(log n)
O(log n)
O(log n)
O(log n)
O(1)
O(1)
O(n)

O(1)
O(1)

O(1)
O(1)

最坏时间复杂度

O(log n)
O(log n)
O(log n)
O(log n)
O(log n)
O(1)
O(1)
O(n)

O(1)
O(1)

O(1)
O(1)

3.unordered set无序集合

unordered_set是一种容器,用于存储一组唯一的元素,并且没有特定的顺序。unordered_set容器使用哈希表来实现元素的存储和访问,因此元素的插入、删除和查找的时间复杂度都是常数时间,即0(1)。

unordered_set的定义和结构如下:
template <class Key, class Hash = hash<Key>,

                 class KeyEqual =equal to<Key>,

                 class Allocator=allocator<Key>>

class unordered set;


Key: 表示存储在unordered set中的元素的类型。

Hash: 表示用于计算元素哈希值的哈希函数对象的类型,默认为hash,使用Key类型的默认哈希函数。

KeyEqual: 表示用于比较元素是否相等的函数对象的类型,默认为equal_to,使用Key类型的默认相等比较函数。

Allocator: 表示用于分配内存的分配器类型,默认为allocator。

unordered_set中的元素是唯一的,即不允许重复的元素存在。当插入一个重复的元素时,unordered_set会自动忽略该元素

这些时间复杂度是基于哈希函数的性能和哈希冲突的情况来计算的。平均情况下,unorderedset的插入、查找和移除操作都具有常数时间复杂度0(1)。然而,在最坏情况下这些操作的时间复杂度可能为O(n)其中n是无序集合中的正素整致:最地性深通设公生在项希决交较为品重的饰况所以我们一般情况下不会使用unordered_set,而选择使用复杂度更稳定的set

函数
insert
erase
find

count

size

描述
向集合中插入元素
从集合中移除元素
查找集合中的元素

返回元素在集合中出现次数

返回无序集合中元素的数量

平均时间复杂度

O(1)
O(1)

O(1)
O(1)

O(1)

最坏时间复杂度

O(n)

O(n)

O(n)

O(n)

O(n)

三、queue

1.queue队列

queue是一种先进先出(FIF0)的数据结构。

queue提供了一组函数来操作和访问元素,但它的功能相对较简单。

queue的定义和结构如下:
template <class T, class Container = deque<T>>
                class queue;


·T:  表示存储在queue中的元素的类型。

*Container:  表示底层容器的类型,默认为degue。也可以使用其他容器类型,如list。queue的内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素。

以下是一些queue的常用函数:

函数
push(x)
pop0
front()
back()

empty()

size()

描述
在队尾插入元素 x
弹出队首元素
返回队首元素
返回队尾元素

检查队列是否为空

返回队列中元素的个数

时间复杂度
O(1)
O(1)
O(1)
O(1)
O(1)

O(1)

priority_queue优先队列


priority_queue与普通队列不同,priority queue中的元素是按照一定的优先级进行排序的。默认情况下,priority_queue按照元素的值从大到小进行排序,即最大元素位于队列的前面priority aueue的定义和结构如下(仅做了解即可):

template <classT, class Container =  vector<T>,

              class Compare = less<typename Container::value type>>
class priority queue;

T: 表示存储在priority queue中的元素的类型,

Container: 表示底层容器的类型,默认为vector。也可以使用其他容器类型,如deque。

Compare: 表示元素之间的比较函数对象的类型,默认为less,即按照元素的值进行比较。priority_queue的内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素,

以下是一些priority_queue的常用函数:

优先队列是一个十分重要的数据结构考察频率极高。

函数

push(x)
pop()
top()
empty()
size()

描述

将元素x插入到优先队列中
弹出优先队列中的顶部元素
返回优先队列中的顶部元素
检查优先队列是否为空

返回优先队列中元素的个数

时间复杂度

O(logN)
O(logN)
O(1)
O(1)
O(1)

接下来介绍几种优先队列修改比较函数的方法

struct compare

{

    {
       bool operator()(int a, int b)          //自定义的比较函数,按照逆序排列

      return a > b;

    }

}

int main()

{
       std: :priority_ queue<int, std::vector<int>, compare> pq;

另一种方法:

auto compare = [ ](int a, int b)        

//自定义的比较函数,按照逆序排列

          {

             return a > b;

          }

}
  std::priority queue<int,std::vector<int>, decltype (compare)> pq(compare)


如果优先队列中的元素类型比较简单,可以直接使用greater<T>来修改比较方法。

priority queue<int,vector<int>,greater<int>>pq;std::greater函数对象定义在<functional>头文件中。

3.deque双端队列

deque(双端队列)是一种容器,它允许在两端进行高效的插入和删除操作。deque是由一系列连续的存储块(缓冲区)组成的,每个存储块都存储了多个元素。这使得deque能够在两端进行快速的插入和删除操作,而不需要移动其他元素。
deque的定义和结构如下(仅做了解即可):

template <class T,class Allocator =allocator<T>)

                 class deque;


T:表示存储在degue中的元素的类型。

Allocator:表示用于分配内存的分配器类型,默认为allocator

degue的内部实现使用了一系列的存储块(缓冲区),每个存储块存储了多个元素,并且通过指针进行连接。

这种设计使得在两端进行插入和删除操作的时间复杂度为常数时间,即0(1)。“单调队列”将使用双端队列来实现。单纯考察双端队列的并不常见。

函数
push back(x)
push_front(x)
pop_back()
pop_front()
front()
back()
empty()
size()
clear()
描述
在尾部插入元素 x
在头部插入元素 x
弹出尾部元素
弹出头部元素
返回头部元素
返回尾部元素
检查 deque 是否为空
返回 deque 中元素的个数
清空 deque 中的所有元素
时间复杂度
平摊O(1)
平摊O(1)
平摊O(1)
平摊O(1)
0(1)
0(1)
0(1)
0(1)
O(N)

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

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

相关文章

规划误差降低27%,碰撞率降低33%Senna: 大规模视觉-语言模型与端到端自动驾驶相结合

Abstract 端到端自动驾驶在大规模数据中展示了强大的规划能力&#xff0c;但在复杂、罕见的场景中仍然因常识有限而表现不佳。相比之下&#xff0c;大型视觉语言模型&#xff08;LVLMs&#xff09;在场景理解和推理方面表现出色。前进的方向在于融合两者的优势。以往利用LVLMs…

Charles简单压力测试

1.接口请求次数&#xff0c;并发量&#xff0c;请求延迟时间均可配置 1.1选中需要进行测试的接口&#xff0c;鼠标右键选中【repeat advance】 2.设置并发参数 下面的图中&#xff0c;选择了1个接口&#xff0c;每次迭代中1个接口同时请求&#xff0c;迭代1000次&#xff08;…

Zookeeper 对于 Kafka 的作用是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper 对于 Kafka 的作用是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Zookeeper 对于 Kafka 的作用是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 在 Kafka…

【机器学习基础】激活函数

激活函数 1. Sigmoid函数2. Tanh&#xff08;双曲正切&#xff09;函数3. ReLU函数4. Leaky ReLU函数 1. Sigmoid函数 观察导数图像在我们深度学习里面&#xff0c;导数是为了求参数W和B&#xff0c;W和B是在我们模型model确定之后&#xff0c;找出一组最优的W和B&#xff0c;使…

leetcode-62-不同路径

题解&#xff1a; 1、设dp[i][j]代表到达(i,j)点最多的路径&#xff1b;题目要求机器人每次只能向右或向下走一步&#xff0c;所以到达(i,j)点的最多路径为到达(i-1,j)的最多路径与到达(i,j-1)的最多路径之和。即dp[i][j]dp[i-1][j]dp[i][j-1]。 2、初始化一个M*N的矩阵dp,将…

C++在实际项目中的应用第三节:C++与数据科学

第五章&#xff1a;C在实际项目中的应用 第三节&#xff1a;C与数据科学 1. C在数据分析中的实际应用 数据分析是数据科学的核心部分&#xff0c;主要涉及数据的清洗、转换和建模。C作为一种高性能的编程语言&#xff0c;越来越多地被应用于数据分析领域。以下是 C 在数据分…

Git上传文件至AtomGit

目录 一、GIt大文件存储 Git LFS 二、Git LFS的使用 1.初始化 2.将大型文件放进LFS管理 三、整体流程 首先&#xff0c;你已经创建属于你自己的本地库了。以下一大型文件上传为基础&#xff0c;50mb的文件可以直接上传至 AtomGit上面&#xff0c;不需要多讲。 一、GIt大文…

北京迅为iTOP-LS2K0500开发板快速使用编译环境虚拟机Ubuntu基础操作及设置

迅为iTOP-LS2K0500开发板 迅为iTOP-LS2K0500开发板采用龙芯LS2K0500处理器&#xff0c;基于龙芯自主指令系统&#xff08;LoongArch&#xff09;架构&#xff0c;片内集成64位LA264处理器核、32位DDR3控制器、2D GPU、DVO显示接口、两路PClE2.0、两路SATA2.0、四路USB2.0、一路…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要&#xff1a;本文涵盖了GIS软件操作的多方面内容&#xff0c;包括地图文档的新建、打开、保存及版本兼容性处理&#xff1b;错误与警告的查阅及帮助文档的使用技巧&#xff1b;地图打印比例尺的调整与地图信息的完善&#xff1b;图层操作的撤销与恢复&#xff0c;界面元素的…

设计模式基础概念(行为模式):责任链模式(Chain Of Responsibility)

概述 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 该模式建议你将这些处理者连成一条链。 链上的每个处理者都有一个成员变量来保存对于…

丝氨酸/苏氨酸激酶(STKs):前列腺癌治疗的新兴靶点

引言 前列腺癌&#xff08;PCa&#xff09;是男性癌症相关死亡的第五大原因&#xff0c;全球约有140万患者&#xff0c;2020年超37.5万死亡病例。 靶向治疗是潜力巨大的领域&#xff0c;PARP、PSMA、STEAP1、DLL3等是前列腺癌治疗的明星靶点。 除此之外&#xff0c;还有哪些…

目录遍历漏洞

目录遍历 目录 概念漏洞分析 加密型传递参数编码绕过目录限定绕过绕过文件后缀过滤(截断上传原理) 漏洞挖掘 访问图片文件测试时去掉文件名只访问目录路径搜索引擎谷歌关键字 pikachu目录遍历 目录遍历与任意文件下载其实差不多,但是如果目录遍历比如etc/passwd只能看不能下…

autMan奥特曼机器人-内置Redis

autMan内置了redis服务&#xff0c;有的脚本运行需要redis支持 几个注意事项&#xff1a; 启用redis服务后要重启autMan生效&#xff0c;关闭一样的道理。启用redis服务后会增加约200M的内存占用多个autMan的redis服务可以组成集群redis服务

如何打造真正吸引人的谷歌网站内容?

谷歌的算法一直以来都被视为一个神秘的“黑盒子”&#xff0c;它通过无数的信号来判断每一个网站的质量和相关性。但事实上&#xff0c;谷歌的许多算法原理和规则都是有迹可循的&#xff0c;比如E-A-T&#xff08;专业性、权威性、可信度&#xff09;就是谷歌判断内容质量的核心…

力扣之612.平面上的最近距离

文章目录 1. 612.平面上的最近距离1.1 题目说明1.2 准备数据1.3 解法1.4 结果截图 1. 612.平面上的最近距离 1.1 题目说明 Point2D 表&#xff1a; ----------------- | Column Name | Type | ----------------- | x | int | | y | int | ----------------- (x, y) 是该表的…

混凝土裂缝图像分割系统:快速图像识别

混凝土裂缝图像分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-RFAConv&#xff06;yolov8-seg-C2f-SCConv等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glo…

echart实现地图数据可视化

文章目录 [TOC](文章目录) 前言一、基本地图展示2.数据可视化 总结 前言 最近工作安排使用echarts来制作图形报表&#xff0c;记录一下我的步骤&#xff0c;需求呈现一个地图&#xff0c;地图显示标签&#xff0c;根据业务指标值给地图不同省市填充不同颜色&#xff0c;鼠标放…

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误 测试环境1、 MYODBC 3.51.18 or higher2、分析和解决2.1 解决1&#xff0c;降级MySQL ODBC2.2 解决2&#xff0c;修改FreeSWITCH代码 测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密…

VSM(价值流图)如何应用于新的生产流程设计?

VSM&#xff08;价值流图&#xff09;如何应用于新的生产流程设计&#xff0c;是当代制造业中提升效率、降低成本和增强竞争力的关键课题。VSM作为一种源自丰田生产模式的精益生产工具&#xff0c;其核心在于通过可视化分析&#xff0c;识别并消除生产过程中的浪费&#xff0c;…

openGauss开源数据库实战十二

文章目录 任务十二 openGauss逻辑结构:表管理任务目标实施步骤一、准备工作二、创建表1.新建表默认保存在public模式中2.在一个数据库的不同模式下创建表3.创建表的时候定义约束4.创建表时使用自增数据类型5.使用现有的表创建新表 三、查看表的信息1.在gsql中查看表的定义2.查看…