电脑突然一炸,什么都没有保存,凉了。(又出现了笔记凉凉事件嘤嘤嘤)

行吧慢慢回忆

就算我们会手写,我们也要学STL。吸了O2的STL可是要上天的。

数据结构

pair

使用方式:

pair<类型名,类型名>变量名

里面的类型是任意的,所以我们也可以有pair<pair<int,int>,int> a,这种诡异的操作。

在pair里面,是以第一个元素为第一关键字,第二个元素为第二关键字进行排序的。

有什么用呢?可以当做一个二元组,代替结构体(在吸氧之后变的贼快)

string

这个东西可以用来代替字符型数组,但是它比字符型数组神奇多了,比如我们可以这样搞:

string a,b;

a+b:把a和b拼起来

例如:

a=qingbei

b=zaotang

a+b=qingbeizaotang

a.size()字符串长度

a[i]:可以下表访问

vector

vector是不定长数组。

写法:vecor<类型> 变量名,例如:vector<int> a

这时用a的话,就写a[i].如果是这样:vector<int>a[100],这时每个a[i]都是一个数组,表示方式就是a[i][j],因为vector分配内存是动态的,所以当数据较大时,可以代替邻接矩阵进行存图。但是它很慢?why?这就和vector分配内存的原理有关。

vector的内存大小永远是2^k。

举个例子,一开始我们往a里面存入一个数,那a的大小就是1,当我们要存第二个数的时候,vector就会制造一个大小为2的连续内存,把第一个数复制过去,再加入第二个数。当要存第三个数时,就开一个大小为4的内存,把第一个数,第二个数复制过去。vector就是这种存储方式。当存的数多了,复制的次数也就多了,所以会慢。当然STL遇见O2就是上天。当然,这样存也是占空间的,但不会造成空间的浪费,这点在数据大的时候是完胜二维数组的。

iterator:vector的迭代器

啥是迭代器?简单的说,就是某个元素的地址(但不严谨,不过这么理解就够了)

vector的遍历:

set

set是个集合,既然是个集合,就肯定不会有重复的元素了。OI的集合还有一个特性:它是有序的。所以set中的元素都要满足可以排序,不然会报错的。

注意这里的a.end()返回的是一个不存在的地址,要用到最后一个,要减一。当a.find()无法找到对应元素的时候,就会返回a.end(),也就是那个不存在的地址。

一些用法qwq

set是个神奇的东西,它的底层是平衡树。顾名思义,就是长得平衡的树。

这就是棵平衡树。

在这里扯淡点有关平衡树的东西。

OI常用平衡树:

替罪羊树红黑树AVL,Treap,伸展树。(小姐姐只讲了替罪羊树,其他的没讲qwq,贴个百度链接好了(其实我看不懂它在说些什么))

什么是替罪羊树?

你有一棵树,它奇丑无比。比如这样

这时候,我们想把它变成平衡树。显然这很费劲,那我们换个思路,不在原图上改变,而是把节点摘出来,在不改变前序遍历的顺序的前提下,重建一棵树。这就是替罪羊树的想法。

前面说到set会自动排序,如果我们想在set里面装点不是int,double之类的类型(比如结构体),怎么办?

首先,我们要手写排序。

就像这种神奇的操作。

Muilt Set

那我们怎么样让它只删除一个数字呢?

我们只删去它的迭代器就好了(也就是a.find(i))

Map

O(n)的暴力扫显然太暴力了,不优雅。我们来想想怎么O(1)就找到它。

cout<<a[__debug]??

上面的东西在一般情况下显然是不行的。

但是我们这里讲的是map

map的第一维是这个数组下标的类型(要求必须可排序),第二维是值。

 栈(Stack)(念zhàn,不念zhài(致某些嘴piao的孩子))

栈是一种后进先出的结构,据说没有什么卵用,平常在没有O2的时候一维数组显然要快。

队列(queue)

这个东西比栈有用多了,在广搜,spfa.....里面用的比较多。

注意队列出队的永远只是队首。

优先队列(priority_queue)

这个东西叫优先队列,但其实和堆没有什么区别。优先队列默认的是大根堆,但我们可以通过一系列神奇的操作把它变成小根堆。

先来看看成员函数

把大根堆搞成小根堆:

priority_queue<int,vector<int>,greater<int> >q  (注意q前面的>前面的空格不能省略)

用结构体:

二.函数

sort

快排大家都用过对吧。

格式:sort(a+开始下标,a+结束下标+1,cmp(比较函数))

sort默认升序排序

这里的比较函数不一定要叫cmp,只要你愿意,叫caixukunjinitaimei都可以qwq

cmp写法(这里拿降序排序举例):

bool cmp (int a,int b)
{return a>b;
}

Reverse

按照输入的顺序倒序输出

用处:目前没有发现

Unique

去重。还是比较常用的。unique要求去重的序列有序,不然会出来一些奇奇怪怪的东西。

比如:

unique返回的是一个迭代器,是去重后的最后一位的下标。

正确打开方式:

输出:

把后面重复的东西置为0:

输出:

fill和memset的区别:fill是填充,memset是清0(也可以是-1)。

但是用其他的数,fill可以操作,但memset之后就是一些鬼畜的东西。而且fill是o(n)的,memset巨快无比

Next Permutation

找到数组的下一个排列

最大用处:全排列(麻麻全排列的题我不用写搜索了qwq)

如果要用这个求全排列的话,复杂度至少是阶乘级别的(吸氧之后就不知道了)

一份全排列的代码+输出

Binary Search

就是二分查找。

格式什么的。

当然要查结构体类型的数组里的数的话,就手写吧,反正我是不会用结构体类型的Binary Search(尝试手写结构体类型的lower_bound,竟然没炸!!!)

Nth Element

把一个数放进有序数组里它该放的位置,还是挺好用的。

当然,在无序的情况下保证放进去的i的前一个数比i大,但不保证整体有序。

复杂度O(n)

Random_Shuffle

随机重排

c++的随机性特别差,总是出现41。这是有原因的,因为rand并不是随机数,而是根据随机种子算出来的一个数。所以我们要得到随机数,就得改随机种子。

一波神奇的操作

清北学堂Day 6之STL的更多相关文章

  1. 7月清北学堂培训 Day 3

    今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...

  2. 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)

    清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...

  3. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  4. 济南清北学堂游记 Day 1.

    快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...

  5. 清明培训 清北学堂 DAY1

    今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1)   高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...

  6. 清北学堂2017NOIP冬令营入学测试

    P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背 ...

  7. 4.4清北学堂Day1 主要内容:数论,数学

    Day 1; 1.常见的高精 输入输出都用字符数组: 字符数组的实际长度用strlen()来求: 运算时倒序运算,把每一个字符都-‘0’ 进位的处理上也要注意: 小数减大数时先判断大小然后加负号 只能 ...

  8. 五一培训 清北学堂 DAY2

    今天还是冯哲老师的讲授~~ 今日内容:简单数据结构(没看出来简单qaq) 1.搜索二叉树 前置技能 一道入门题在初学OI的时候,总会遇到这么一道题.给出N次操作,每次加入一个数,或者询问当前所有数的最 ...

  9. 清北学堂学习总结 day1 数据结构 练习

    1.二叉搜索树 STL set直接做就可以了 2.树状数组+差分数列: codevs 1081 线段树练习 2  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Maste ...

随机推荐

  1. Mac入门--通过Homebrew安装PHP(新)

    1 首先安装homebrew,安装过的话更新 安装:homebrew官网地址:https://brew.sh/index_zh-cn.html.或者直接复制下面代码: /usr/bin/ruby -e ...

  2. centos7下搭建Testlink环境详细过程

    花了半天的时间终于搭建好了完整的Testlink环境,主要包括Mysql以及PHP的版本.未关闭防火墙.以及安装配置过程中遇到的一些问题.以下是详细的搭建过程. 一.工具准备 以下是我在搭建过程中用到 ...

  3. C++调用C#类库函数

    最近做一个信息化三维仿真项目,基于第三方提供的虚拟引擎通过VC++2008做二次开发,其中涉及到与C#客户端的融合以及数据交互的问题, 主要是VC++需要调用C#客户端提供的类库内的接口获取C#客户端 ...

  4. 牛客练习赛51 C 勾股定理https://ac.nowcoder.com/acm/contest/1083/C

    题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角三角形. 输入描述: 一个整数n. 输出描述: 另外两条边b,c.答案不唯一,只要输出任意一组即为合理, ...

  5. 谈一下你对 uWSGI 和 nginx 的理解??

    1.uWSGI 是一个 Web 服务器,它实现了 WSGI 协议.uwsgi.http 等协议.Nginx 中HttpUwsgiModule 的作用是与 uWSGI 服务器进行交换.WSGI 是一种 ...

  6. P1455 搭配购买 (并查集+01背包)

    [题目描述] 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵 ...

  7. BZOJ 1908. Pku2054 UVA1205 Color a Tree

    传送门 看一眼感觉 $dp$,发现状态没法维护 考虑贪心,然后就想了两个错的贪心... 正解好神啊 首先如果权值最大的点能够一步染色那么肯定要染它 意思就是,一旦父节点被染色那么它就要接着被染色 那么 ...

  8. 可下拉的PinnedHeaderExpandableListView的实现

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/singwhatiwanna/article/details/25546871 转载请注明出处:htt ...

  9. Eureka注册中心高可用及常用配置项

    一.前言 前面已经简单的介绍了 Eureka 注册中心的使用以及查看.下面将继续进行 Eureka 的说明以及应用. 二.Eureka 的高可用搭建 在实际生产项目中,为了保证服务的可用性,连续性,一 ...

  10. grunt默认只允许localhost和访问,如何设置外部IP地址访问

    转载请注明出处: 猩猩队长  http://www.cnblogs.com/wayns/p/access_grunt_server_from_outside.html 使用Yeoman生成器创建web ...