算法竞赛100天第2天——STL IN C++(算法竞赛必备知识总结汇总)

news2024/10/6 12:21:03

本文已收录于专栏

🌲《百日算法竞赛》🌲

目录

前言:

序列容器

序列的要求:

1.vector

vector常用方法

vector遍历

2、deque

头文件

方法

3、list

头文件

方法

4、queue

方法:

关联容器

1、map

2、set

添加

获取

总结

使用

不断补充……

vector

pair

string

queue

priority_queue 优先队列(堆),默认是大根堆

stack

deque 双向队列

set , map , multiset , multimap 基于平衡二叉树(红黑树),动态维护有序序列

unordered_set , unordered_map ,

unordered_multiset , unorder_multimap 哈希表

bitset 压位


前言:

我们在打比赛的时候为了方便通常会使用模板库,C++有STL标准模板库,Java对应的则是集合框架,C++比赛经常用容器,那么什么是容器呢?

容器是储存其他对象的对象。被储存的对象必须是同一类型。

只要是学过编程的兄弟都知道,这个定义后半句好像数组,确实,但是不尽相同。

分类:
容器分为两个部分,一是序列容器(是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定)(forword_list,list,queue,priority_queue,stack,deque,vector,array)。


另一个是关联容器(关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。元素是有序的集合,默认在插入的时候按升序排列(set,multiset,map,multimap)

序列容器


序列的要求:

X a(n,t)  //声明一个名为a的有n个t组成的序列
X(n,t)     //匿名序列(这里我们不做过多的解释)
X a(i,j)   //声明一个名为a的序列,并且初始化(i,j)
的内容
X(i,j)      //匿名序列
v.insert()   //由于insert重载方法比较多
   1.v.insert(p,t)//将t插到p的前面
   2.v.insert(p,n,t)//将n个t插入p之前
   3.v.insert(p,i.j)//将区间[i,j)的元素插入到p之前
v.erase(t,k)
   1.v.erase(t,k)//删除他们之间的元素
   2.v.erase(p)//删除p指向的元素
v.chear===v.erase(begin(),end());

1.vector

vector表示一段连续的内存,基于数组实现,他有自动的内存管理功能!

可以动态的改变vector的长度,并随着元素的增加与减小来自动改变数组大小,它提供了直接添加尾部元素或者删除元素的方法!
特点:
他可以反转序列,所以它可以反向遍历可反转序列!(基于他的rbegin,rend)

使用前要调用头文件

  #include<vector>
vector<int> v;//默认初始化
vector<int> v(v1);//用v1初始化v
vector<int> v(v1.begin(),v1.end());//用v1初始化v
vector<int> v(100);//定义一个大小为100的数组!
vector<int> v(100,1)//定义个全为1而且长度为190的数组

vector常用方法

a.front(),a.rbegin()      //首元素
a.back(),a.rend()         //末尾元素
v.push_back()             //增加元素

v.insert()                
   1.v.insert(p,t)        //将t插到p的前面
   2.v.insert(p,n,t)      //将n个t插入p之前
   3.v.insert(p,i.j)      //将区间[i,j)的元素插入到p之前

v.pop_back()              //删除

v.erase(t,k)
   1.v.erase(t,k)         //删除他们之间的元素
   2.v.erase(p)           //删除p指向的元素

v.clear===v.erase(begin(),end());//清空vector

vector遍历

//下标
int length = v.size();
for(int i=0;i<length;i++)
 {
    cout<<v[i];
 }
cout<<endl;

//迭代器
vector<int>::const_iterator iterator = v.begin();
 for(;iterator != v.end();iterator++)
{
     cout<<*iterator;
}

2、deque


双端队列,他的实现与vector类似,支持随机访问,但是它访问首元素的插入(push_front())与删除(pop_front())的时间是固定的!而且他的执行速度要比vector快很多!所以题目中有大量的操作发生在序列的起始位置与结尾处,我们就要考虑用deque!

头文件

#include<deque>

方法

只是比vector多了两个处理头的方法

d.push_front(1);
d.pop_front(1);

3、list


双向链表,list在链表中的任意一个位置插入与删除一个元素时间是固定的!但是他不能随机访问,优点是元素的快速插入与删除!从容器中插入与删除元素之后i,迭代器指向元素将不变,不会移动已有元素,只是修改链表信息。

头文件

#include<list>

方法

void sort()                  //使用<运算符对链表进行快速排序,时间复杂度O(NlogN)

void merge(list<T,Alloc>&x)  
//将x与调用链表合并,要求:两个链表必须要已经排好序!
//元素将保存在调用链表中,x为空,这个时间复杂度为线性!

void remove(const T &val)    //删除val的所有实例

void splice(iterator pos,list<T,Alloc>x)
//将链表x的内容加到pos的前面

void unique()     //去重(对list里面所有重复元素进行去重,然后再排序)
forward_list 容器以单链表的形式存储元素。
forward_list 的模板定义在头文件 forward_list 中。
fdrward_list 和 list 最主要的区别是:它不能反向遍历元素;只能从头到尾遍历。

​ 

 想要深入了解forward_list的看这里C++ forward_list用法详解 (biancheng.net)

4、queue


这是一个配适器类,ostream_iterator就是一个配适器,让输出流能够使用迭代器接口,同样它实现了队列接口!它不仅不允许随机访问元素,而且还不能遍历队列!元素只能先进先出(FIFO).

方法:

bool empty()//判断是否为空
front()//队首元素的访问
back()//队尾元素的访问
push(x)//队尾插入x
pop()//删除队首元素

关联容器


它运用了键值对(value-key),与java类似的map,例如hashmap,有点在于他提供了利用key快速访问功能,它的底层结构应该是一种树来实现的,所以他才有如此快的查找速度,最简单的set,他的键值对类型是一致的,而且唯一,元素默认按升序排列。map他的键值对类型不同,键是唯一的,元素默认按键的升序排列。

m.lower_bound(k)//返回一个迭代器,指向键不小于 k 的第一个元素
m.upper_bound(k)//返回一个迭代器,指向键大于 k 的第一个元素
m.equal_range(k)//返回一个迭代器的 pair 对象。它的 first 成员等价于 m.lower_bound(k)。而 second 成员则等价于 m.upper_bound(k)

1、map


map 是键-值对的集合。map 类型通常可理解为关联数组:可使用键作为下标来获取一个值,正如内置数组类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。

map<int,string> map1;    //默认为空
m.insert()
    1.m.insert(e)//e是一个用在m上的value_kry 类型的值。如果键(e.first不在m中,则插入一个值为e.second 的新元素;如果该键在m中已存在,则保持m不变。该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个 bool 类型的对象,表示是否插入了该元素
    2.m.insert(begin,end)//begin和end是标记元素范围的迭代器,其中的元素必须为m.value_key 类型的键-值对。对于该范围内的所有元素,如果它的键在 m 中不存在,则将该键及其关联的值插入到 m。返回 void 类型
    3.m.insert(iter,e)//e是一个用在m上的 value_key 类型的值。如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。返回一个迭代器,指向m中具有给定键的元素
m.count(k) //返回m中k的出现次数
m.find()   //如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器.
m.erase()  //具体与序列该方法一致!


2、set


支持插入,删除,查找等操作,就像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。Set默认自动排序。使用方法类似list。
set容器的定义和使用

set 容器的每个键都只能对应一个元素。以一段范围的元素初始化set对象,或在set对象中插入一组元素时,对于每个键,事实上都只添加了一个元素。

vector<int> ivec;
for(vector<int>::size_type i = 0; i != 10; ++i) {
ivec.push_back(i);
ivec.push_back(i);
}
set<int> iset(ivec.begin(), ivec.end());
cout << ivec.size() << endl;//20个
cout << iset.size() << endl;// 10个


添加

set<string> set1;
set1.insert("the"); //第一种方法:直接添加
set<int> iset2;
iset2.insert(ivec.begin(), ivec.end());//第二中方法:通过指针迭代器


获取

set<int> iset;
for(int i = 0; i<10; i++)
iset.insert(i);
iset.find(1)// 返回指向元素内容为1的指针
iset.find(11)// 返回指针iset.end()
iset.count(1)// 存在,返回1
iset.count(11)// 不存在,返回0

总结

  1. 有序容器(除了list):存储底层vector,只是添加了不同的接口!
  2. deque(队列):它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪。向deque 两端添加或删除元素的开销很小,它不需要重新分配空间。
  3. list(列表):是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。
  4. 后面的关联与无序关联都是用的一种树状结构!

使用

  1. 当数组大小未知时,和需要高效的查询功能,用vector!高效地随机存储。
  2. 不使用连续的内存空间,而且可以随意地进行动态操作,有大量的插入、删除操作,用list!
  3. 需要在两端进行push 、pop用daque!它兼顾了数组和链表的优点,它是分块的链表和多个数组的联合。所以它有被list 好的查询性能,有被vector 好的插入、删除性能。 如果你需要随即存取又关心两端数据的插入和删除,那么deque 是最佳之选。
  4. 需要查找或者打表可以选择map与set,当然一定条件下我们可以优秀考虑用无序关联容器!

不断补充……

vector

    size()  
    empty()  
    clear()
    front()/back()
    push_back()/pop_back()
    begin()/end()
    支持比较运算符,按字典序 例:vector<int> a(3,4);vector<int> b(4,3); 444>3333  a>b
    nth_element(a,a+x,a+n)数组a的总长度为n,函数执行完后前x个数都比x+1位置上的小,后面所有数都比x+1位置上的数大,但不要求有序


pair

    pair<int,int>
    first  第一个元素
    second  第二个元素
    支持比较运算符,以first为第一关键字,以second为第二关键字(字典序)

string

    substr()第一个参数开始位置,第二个参数截取的长度
    c_str()  返回字符串首地址
    size()/length()  返回字符串长度
    empty()
    clear()
    push_back('c')  string拼接char型

queue

    size()
    empty()
    push()
    pop()
    front()
    back()

priority_queue 优先队列(堆),默认是大根堆

    push()
    top()
    pop()
定义成小根堆的方式:(1)存入其相反数-x   (2)priority_queue<int,vector<int>,greater<int>> q;

stack

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

deque 双向队列

    size()
    empty()
    clear()
    front()/back()
    push_back()/pop_back()
    push_front()/pop_front()
    begin()/end()
    []

set , map , multiset , multimap 基于平衡二叉树(红黑树),动态维护有序序列

    size()
    empty()
    clear()
    begin()/end() ++,-- 返回前驱和后继

    set/multiset  set里元素维一,multiset里可以有多个相同的元素
        insert()  插入一个数
        find() 如果不存在返回end()
        count() 返回某一个数的个数
        erase()
            (1)输入的是一个数x,删除所有x   o(k+logn)
            (2)输入的是一个迭代器,删除这个迭代器
        lower_bound()/upper_bound()
            lower_bount(x)  返回大于等于x的最小的数
            upper_bount(x)  返回大于x的最小的数
    map/multimap
        insert()  插入一个pair
        erase()  输入的参数是pair或者迭代器
        [ ]  时间复杂度o(logn)

unordered_set , unordered_map ,

unordered_multiset , unorder_multimap 哈希表

和上面类似,增删改更快o(1)
但不支持 lower_bound()/upper_bound()/迭代器++,--

bitset 压位

    bitset<10000> s;
    ~ & | ^
    >> ,<<,==,!=,[]
    count() 返回有多少个1
    any() 判断是否至少有一个1
    none() 判断是否全为0
    set() 把所有位置置成1
    set(k,v) 把第k位变成1
    reset()把所有位变成0
    flip() 等价于~
    flip(k) 把第k位取反

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

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

相关文章

SWPUCTF 2022新生赛部分wp

&#x1f60b;大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白。 本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;一起学习&#x1f497;&#xff0c;一起进步⭐️。⭐️此后如竟没有炬火&#xff0c;我便是唯一的光。⭐️[SWPUCTF 2022 新生赛]ez_ez_ph…

【算法】链表

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录链表数组转链表链表转数组往链表的前面增加一个节点获得指定位置的值在链表的末尾增加一个节点在…

我最近发现的一些问题。

‍‍ 大家好&#xff0c;我是小z&#xff0c;也可以叫我阿粥~这段时间看了不少分析报告&#xff0c;启发颇多。也发现有一些普遍存在且很容易误导分析师的问题。在聊问题之前&#xff0c;先给大家分享一个&#xff08;我刚写的&#xff09;小故事&#xff1a;有一个学生…

Pytorch 多项式拟合

目录 1、训练误差和泛化误差 2、独立同分布假设 3、欠拟合和过拟合 4、多项式回归 1、训练误差和泛化误差 训练误差&#xff08;training error&#xff09;是指&#xff0c; 模型在训练数据集上计算得到的误差。 泛化误差&#xff08;generalization error&#xff09;是指…

【OpenCV 例程 300篇】255.OpenCV 实现图像拼接

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】255.OpenCV 实现图像拼接 6.2 OpenCV 实现图像拼接 OpenCV中图像的数据结构是Numpy数组&#xff0c;使用切片方法可以实现图像的裁剪&#xff0c;使用数组堆叠方法可以实现图像的拼接。 Numpy 函数…

K8S Replication Controller 示例

K8S Replication Controller Replication Controller可确保在任何时间运行指定数量的pod副本。换句话说&#xff0c;ReplicationController确保一个pod或一组同类pod始终处于可用状态。 可以理解为Replication Controller &#xff08;RC&#xff09;是基于 K8S Pod对象之上的…

PR采购申请启用灵活工作流配置

目录 1. 检查系统基础工作流配置 2. 激活标准场景模版 WS02000458 3. 维护收件箱操作按钮文本 4. 维护任务代理及激活事件 5. 配置Inbox审批页面 6. PR灵活工作流启动配置 7. 为流程设置代理人 8. 配置工作流场景 9. 可扩展部分 官方Help文档路径&#xff1a; SAP He…

算法_杨氏矩阵_杨氏矩阵算法_剑指offer

目录 一、问题描述 二、问题分析 三、算法设计 ​四、代码实现 一、问题描述 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N);…

【目标检测】Cascade RCNN中的两个常见问题

一、关于mismatch问题 在training阶段和inference阶段使用不同的阈值很容易导致mismatch&#xff0c;什么意思呢&#xff1f; 在training阶段&#xff0c;由于给定了GT&#xff0c;所以可以把与GT的IoU大于阈值的proposals作为正样本&#xff0c;这些正样本参与之后的bbox回归…

【C语言】深入浅出讲解函数栈帧(超详解 | 建议收藏)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;凡人修C传 &#x1f4ac;总结&#xff1a;希望你看完之后&…

基于机器学习与协同过滤的图书管理推荐系统

基于机器学习与协同过滤的图书推荐系统 一、系统结构图 二、Demo示例 完整源码可联系博主微信【1257309054】 点我跳转 三、K-means聚类机器学习推荐算法 1、原理 从数据库中 1、首先获取书籍类别 2、获取用户注册时勾选喜欢的类别&#xff0c;勾选的为1&#xff0c;否则…

让 Java Agent 在 Dragonwell 上更好用

本文是《容器中的Java》系列文章之 3/n&#xff0c;欢迎关注后续连载 &#x1f603; 。1 背景 随着越来越多的云原生微服务应用的大规模部署&#xff0c;大家对微服务治理的能力需求越来越强。 Java Agent技术能够让业务专注于业务逻辑&#xff0c;与此同时&#xff0c;中间…

kali渗透测试到底该如何学?

1、渗透测试是什么&#xff1f; 渗透测试&#xff0c;是为了证明网络防御按照预期计划正常运行而提供的一种机制。渗透测试是通过各种手段对目标进行一次渗透&#xff08;攻击&#xff09;&#xff0c;通过渗透来测试目标的安全防护能力和安全防护意识。打个比方&#xff1a;比…

手写spring12(把aop动态代理整合到spring生命周期)

文章目录目标设计项目结构四、实现1、定义Advice拦截器链2、定义Advisor访问者3、方法前置拦截器——MethodBeforeAdviceInterceptor4、代理工厂——ProxyFactory5、融入Bean生命周期的自动代理创建者——InstantiationAwareBeanPostProcessor 、DefaultAdvisorAutoProxyCreato…

什么是3dMax中的“块”?如何在3dMax中使用“块”?

3dMax 块简介 3dMax 是一款用于设计 3d 模型的软件,在 3d 建模图形专业人士中最受欢迎。我们可以在此软件中导入不同类型的预设计 3d 模型,以简化我们的工作。块是不同类型的 3d 模型,您可以从互联网上下载,然后将它们导入到 3dMax 软件的项目工作中,以节省您的时间。在本…

Python和OpenCV创建超快的“for”像素循环

这篇博客将介绍如何使用Python和OpenCV创建超快的“for”像素循环&#xff08;逐像素循环&#xff09;&#xff0c;即Cython快速优化for循环&#xff1b; 使用Python和OpenCV逐像素循环图像是一个非常缓慢的操作&#xff0c;即使图像在内部由NumPy数组表示。 为什么会这样&am…

C语言-指针进阶-qsort函数的学习与模拟实现(9.3)

目录 思维导图&#xff1a; 回调函数 qsort函数介绍 模拟实现qsort 写在最后&#xff1a; 思维导图&#xff1a; 回调函数 什么是回调函数&#xff1f; 回调函数是一个通过函数指针调用的函数。 将一个函数指针作为参数传递给一个函数&#xff0c;当这个指针被用来调用…

57、JDBC和连接池

目录 一、JDBC基本介绍 二、JDBC快速入门 三、JDBC API 1、ResultSet [结果集] 2、Statement 3、PreparedStatement 4、DriverManager 四、封闭JDBCUtils 五、事务 六、批处理 七、数据库连接池 4、数据库连接池种类 &#xff08;1&#xff09; c3p0数据库连接池&…

MacBookPro 遇到pip: command not found问题的解决

学习Pyhton的时候&#xff0c;需要安装第三方插件pyecharts,执行以下命令&#xff1a; pip install pyecharts总是报错 pip: command not found 我很郁闷&#xff0c;于是上网搜索尝试各种命令&#xff0c; 命令1:curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 命…

Codeforces Round 507(div. 1) C(分类讨论,并查集)

题目链接&#xff1a; Problem - C - Codeforceshttps://codeforces.com/contest/1039/problem/C 题意&#xff1a; 计算机网络由个服务器组成&#xff0c;每个服务器有到范围内的加密秘钥。设是分配给第i台服务器的加密密钥。对服务器通过数据通信通道直接连接。由于加密算…