C++ STL 知识小结
qwq...接近联赛,就在这里对STL做一点知识小结吧,因为STL曾经失分很多。
简介
(来自Baidu) STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用安装额外的库文件。
声明
每一个大标题下的某个容器,其名称和头文件相同。如queue/priority_queue的头文件是queue。
vector
vector可以理解一个不定长数组,内部基于倍增思想实现,在我们设置vector的时候,它申请的内存空间往往是我们设置的2倍,所以使用的时候要谨慎,爆空间就危险了。vector支持随机访问,就像数组一样,但不支持像链表一样O(1)插入,一般是在末尾增删。
操作函数:
size:返回此数组的实际长度。
empty:判断是否为空,为空则返回true。
(所有的STL容器都支持这两个方法,含义也相同)
clear:将vector清空。
迭代器声明:vector<int>::iterator
begin/end:指向vector中第一个/最后一个元素的迭代器。星号*则可解除引用。和指针的用法类似。
front/back:返回vector的第一个元素或最后一个元素。等价于*a.begin()/a[0]或*--a.end()/a[a.size()-1]。
push_back(x):将x插入到vector中成为最后一个元素。
pop_back:删除vector的最后一个元素。
vector的用处很多,比较经典常用的就是代替前向星存储树和图等结构。
queue
queue下主要包括了循环队列queue和优先队列priority_queue这两种操作。
循环队列queue
push(x):将x插入队尾,O(1)操作。
pop:将队头的元素出队。
front/back:O(1)访问队头/队尾元素。
循环队列可用于优化最短路算法,适用SPFA和Dijkstra。
优先队列priority_queue
可以把优先队列理解成一个大根二叉堆。
push(x):把元素x插入堆中。
pop:删除堆顶元素。
top:查询堆顶元素,也就是队列中的最大值。
小根堆priority_queue
每次我们插入一个元素,把这个元素的相反数插入优先队列中。这样一来,绝对值小的反而在堆顶,用一种巧妙的方法来实现小根堆。
deque
双端队列deque是一个支持在队列头尾入队/出队的很妙的结构,基本上所有操作都是神仙O(1)。
front/back:访问队头/队尾元素。
push_back(x)/push_front(x):从队尾/队头入队x。
pop_back/pop/front:删除队头/队尾元素。
clear:清空队列。deque除了这个操作是O(n)其他都是O(1)。
begin/end:返回首部/尾部迭代器。
[]:deque可以像vector或者普通数组一样支持下标随机访问,仍然是O(1)。
set
顾名思义是集合。set下主要包含了set和multiset两个容器。分别是有序集合和有序多重集合。也就是说set的元素不能重复,但multiset是支持的,其内部实现是一棵红黑树,支持的操作基本相同。
size/empty/clear:和vector类似。
迭代器:声明为set<int>::iterator it,它们的迭代器称为双向访问迭代器,不支持随机访问qwq,支持*解除引用,支持++和--,由于内部是红黑树实现,可想而知复杂度是logn。
begin/end:返回首尾元素的迭代器,begin是最小的元素,根据有序可以看出来。但由于是前闭后开且从零开始,--a.end()最后才会返回最后一个元素的地址。
insert(x):把一个元素x插入到集合当中,时间复杂度是logn,因为要维护有序。
insert的一个演示。
#include<cstdio>
#include<set>
using namespace std;
set<int>s;
int main()
{
s.insert();
s.insert();
for(set<int>::iterator it=s.begin();it!=s.end();it++)
printf("%d ",*it);
return ;
}
find(x):在set中寻找x这个元素并且返回它的迭代器,若没有则返回end()。
lower_bound(x):查找>=x的元素中最小的一个,并返回它的迭代器。
upper_bound(x):查找>x的元素中最小的一个,并返回它的迭代器。
erase(x):若x的类型是迭代器,那么就会删除迭代器所指向的元素,若x指的是元素,就会删除集合中所有等于x的元素(前提是multiset)。
count(x):返回元素x的个数,复杂度是O(k+logn),k为元素x的个数,上同。(适用于multiset)
红黑树是平衡树的一种实现方式,感兴趣的同学可以学一学平衡树。
map
map容器是一个键值对key-value的映射。内部是一棵以key为关键字的红黑树。key和value都可以是任意类型。
声明:map<key_type,value_type>
map容器建立复杂信息key(如字符串)到简单信息value的映射。
size/empty/clear/begin/end:与set类似,分别为元素个数,判空,清除,开始,结束。
insert:表示插入。插入方式的表示:
a.insert(pair<int,string>(,"bbb"));//第一种插入方式
a.insert(pair<int,string>(,""));//不会覆盖
a.insert(map<int, string>::value_type (,"aaa"));//第二种插入方式
a.insert(map<int, string>::value_type (,""));//不会覆盖
a[]="ccc";//第三种插入方式
a[]="";//会覆盖
map<string,int>s;
s.insert(make_pair("August",));
s.insert(make_pair("July",));
map<string,int>::iterator it=s.begin();
pair<string,int> p=*it;
cout<<p.first<<" "<<p.second<<endl;
it++;
cout<<s["August"];
return ;
count(x):返回指定元素x出现的次数。当然,x应该是value。
lower_bound(x)/upper_bound(x):返回>=/>x的第一个元素。
find(x):查找某个元素是否存在,若不存在则返回尾部迭代器。
erase(x):删除某个元素。
[]:[]操作符的下标存储的是key,本身存储的是value。
bitset
bitset可以看成一个多位二进制数,每八位占一个字节,n位bitset执行一次位运算的复杂度视为n/32。
声明:bitset<10000>s,申请一个10000位的二进制数。
~s:返回对s取反的结果。
&,|,^:返回对两个数位相同的bitset进行按位与、或、异或运算的结果。
>>,<<:返回对一个bitset右移,左移若干位的结果。
==,!=:比较两个bitset代表的二进制数是否相等。
[]:s[k]表示s的第k位,当然可以用来取值赋值。
count:判断有多少位位1。
any:有任意位为1都返回true,若没有任何1则返回false。
none:有任意位为1都返回false,若没有任何1则返回true。
set:把所有位变为1。
set(k,v):把第k位变为v。
reset:把所有位变为0。
reset(k):把第k位变为0。
flip:把所有位取反。
flip(k):把第k位取反。
总结
STL里面的大多结构都能手写(你要是会写红黑树 STL对你来说就基本没用了),但是很多时候考场上我们没有时间去写一些复杂的结构,所以STL成了非常黑科技的代替,但是要慎用,因为STL各种容器的复杂度很玄学,除非你有绝对的把握,不要瞎搞。qwq
C++ STL 知识小结的更多相关文章
- Android app开发知识小结
Android知识小结 这是一个知识的总结,所以没有详解的讲解. 一.分辨率Android中dp长度.sp字体使用.px像素.in英寸.pt英寸1/72.mm毫米 了解dp首先要知道density,d ...
- C/C++ 位域知识小结
C/C++ 位域知识小结 几篇较全面的位域相关的文章: http://www.uplook.cn/blog/9/93362/ C/C++位域(Bit-fields)之我见 C中的位域与大小端问题 内存 ...
- JAVA 变量 数据类型 运算符 知识小结
---------------------------------------------------> JAVA 变量 数据类型 运算符 知识小结 <------------------ ...
- html5-基本知识小结及补充
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- HTTPS知识小结
HTTPS知识小结 背景1:TCP握手 internet上的两台机器A,B要建立起HTTP连接了,在这之前要先建立TCP连接,情景大概是这样子的: A:你好,我跟你建立一个TCP好吗? B:好啊. A ...
- shell 环境变量的知识小结
环境变量的知识小结:·变量名通常要大写.·变量可以在自身的Shell及子Shell中使用.·常用export来定义环境变量.·执行env默认可以显示所有的环境变量名称及对应的值.·输出时用“$变量名” ...
- 180531-Spring中JavaConfig知识小结
原文链接:Spring中JavaConfig知识小结/ Sring中JavaConfig使用姿势 去掉xml的配置方式,改成用Java来配置,最常见的就是将xml中的 bean定义, scanner包 ...
- javascript之正则表达式基础知识小结
javascript之正则表达式基础知识小结,对于学习正则表达式的朋友是个不错的基础入门资料. 元字符 ^ $ . * + ? = ! : | \ / ( ) [ ] { } 在使用这些符号时需要 ...
- PS修图知识小结
PS修图知识小结 [1]人去除红眼. 1.用红眼工具,框选红眼不分. 2.用椭圆选区工具,选择红眼部分 3..创建调整图层,亮度.对比度.加大对比度. 4.选择红眼部分.创建调整图层,可选颜色,减 ...
随机推荐
- 【WEB基础】HTML & CSS 基础入门(2)选取工具:VS2019安装使用
前面 子曰“工欲善其事,必先利其器”.开始编写HTML代码前,我们该选择一款编辑工具,实际上,HTML作为标记语言,我们甚至可以直接用记事本来编写HTML代码,但记事本实在弱爆了.这里推荐使用Visu ...
- 2019 东软java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.东软等公司offer,岗位是Java后端开发,最终选择去了东软. 面试了很多家公司,感觉大部分公司考察的点都差不多 ...
- HDU2476 String painter(DP)
题目 String painter 给出两个字符串s1,s2.对于每次操作可以将 s1 串中的任意一个子段变成另一个字符.问最少需要多少步操作能将s1串变为s2串. 解析 太妙了这个题,mark一下. ...
- 【转】【Salesforce】salesforce 零基础学习(十七)Trigger用法
看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...
- jemter csv参数化时注意问题
csv设置 请求参数中引用参数注意点: 查看结果树-请求-http:查看结果,乱码问题解决 1.需要设置下请求体编码 csv设置线程共享模式: 所有线程:测试计划中所有线程,假如说有线程1到线程n ( ...
- Nginx 脚本自动进行日志切割
随着网站的运行时间越来越长,日志文件也会随之越来越大需要对Nginx日志进行切割,下面是每周六晚上自动进行日志切割的shell脚本 脚本如下: [root@jrjs ~]# vim /usr/loca ...
- VMware15.5版本安装CentOS7
VMware15.5版本安装CentOS7 一.在VMware15.5中新建虚拟机 1.打开VMware,在首页面选择创建新的虚拟机. 2.新建虚拟机向导,选择典型配置.3.选择稍后安装操作系统.4. ...
- jquery选择器之全选择器
在CSS中,经常会在第一行写下这样一段样式 * {padding: 0; margin: 0;} 通配符*意味着给所有的元素设置默认的边距.jQuery中我们也可以通过传递*选择器来选中文档页面中的元 ...
- keepalived日志显示脚本能执行成功,但是amoeba程序没启动起来,单独执行脚本amoeba能启动成功,放到keepalived里面启动不起来
keepalived日志如图: 解决:keepalived还有crontab等计划任务自动执行脚本,并不会有本地用户的环境变量,需要在脚本里面加 . /etc/profile 引入本地用户的环境变量
- php中array的常用操作示码
融会了,也就熟悉了. 这事得多练,多改. <?php $empty1 = []; $empty2 = array(); $names = ['Harry', 'Ron', 'Hermione'] ...