STL库学习笔记(待补充QAQ
几百年前就说要学STL了然后现在还没动呢QAQ总算还是克服了懒癌决定学下QAQ
首先港下有哪几个vector listset map stack queue,大概就这些?
然后因为有几个基本操作每个都有实在太无聊了所以单独提出来在最前面讲解一下就是了qwq之后就只是列出来告诉你有这个操作qwq
基本操作
stl.begin() 返回开头,返回iterator O(1)
stl.end() 返回尾端的下一个元素(注意是下一个鸭!),同返回iterator O(1)
stl.size() 返回它的大小 O(1)
stl.empty() 返回一个bool值判断是否为空 O(1)
stl.clear() 清空操作 O(size())
stl.erase(iterator) stl.erase(iterator,iterator) stl.erase(data) 删除某个点或某个区间(不记得左右闭开了QAQ)或某个值 O(log(size()))或O(size)
stl.rbegin() stl.rend(),一个很蛇皮的玩意儿,,,好像就stl.rbegin()=--stl.end() stl.rend()=--stl.begin() 无法理解存在意义?太蛇皮了趴2333 O(1)
stl.find(data) 找到了返回iterator找不到返回stl.end()
stl.count(data) 返回data出现了几次
stl.top()或stl.front() 返回头 O(1)
stl.back() 返回尾 O(1)
stl.pop() 删除头(加上front/back什么的也挺好理解不另外写了qwq) O(log(size()))
stl.push(data)(同上括号内) 插入data O(log(size()))
stl.lower_bound(stl.begin(),stl.end(),data) stl.upper_bound(stl.begin(),stl.end(),data) 返回iterator O(log(size()))
关于vector
vector,就是个,动态数组,和普通数组的差别好像就是没有限制大小?就可以一直加入一直加入的
通常应用于图的存边啥的?
然后介绍下迭代器iterator,话说我当初想学STL就是被这个玩意儿直接吓跑了呢QAQ
其实就是个指针,*iterator指向数值(这个可以理解为数组下标就成了?
然后vector中是可以+=k的,意味着快速转移到某个位置是资瓷的.啊还有就是它还资瓷直接访问下标的qwq
然后介绍下vector的成员函数们
vector.begin() vector.end() vector.size() vector.push_back(data)
vector.insert(iterator,data),表示在iterator指针前加入一个数值 然后因为vector是分块存储的,所以时间复杂度是O(log(size()))的,比普通的数组就会快些
vector.clear(),这个有个要注意的是,此处的clear并不意味着真的把所有元素清空然后释放内存,它只是把size清空了而已,能懂?举个栗子趴再,就比如我有个vector<int>={1,2,3},clear之后,如果for(to size),是不会有输出的,但是如果我直接写的for(to 3)就会输出"1,2,3" 所以它是O(1)的
vector.remove(iterator,iterator,data),表示把这一段区间的值不是data的按顺序提到前面去,并返回不是data的最后一位的后一位(好像是后一位?PPT的表述我没太懂QAQ) 然后注意一下就是remove和erase结合使用更佳,他们放一块的话就可以做到把vector中所有数值为data的删掉的操作,懂?
然后有几个能用但不是成员函数的东西也港下qwq
一个是sort,对vector也是有用的,用法差不多,不多讲了qwq
然后reverse,翻转操作,也能用,也差不多不多讲了qwq(,,,话说我怕是还要开个函数总结?其实reverse的用法我只知道个大概具体怎么搞也不清楚啊QAQ
最后港下vector比较方式?就字典序比较,从前往后比就是了
习题
1)谁的孙子最多IⅡ(...名字好蛇皮啊2333333其实就是树相关的操作 [ ]
2)链表操作 [ ]
3)数组操作 [ ]
4)排序 [ ]
5)序列翻转 [ ]
关于set&multiset
set是个好东西鸭!大概港下嗷qwq
它封装了个贼高级的数据结构,叫红黑树,也就是,平衡检索二叉树
简单来说就是它可以自动排序,并且它的所有操作(插入删除查找)都是O(log(size()))的,所以跑起来挺快,虽然有点儿常数趴,但是开个O2效率就挺高了
然后关于set先说说几点注意事项
1)它不能有重复元素,如果要重复元素请移步multiset,听说用法差不多qwq
2)它不能直接修改内部的元素的值
3)它的iterator只能++--不能+=k,意味着只能一步步挪不能一下跳到某个位置QAQ
4)它不能直接访问下标
好dei注意事项港完就开始港成员函数了
set.size() set.empty() set.clear() set.erase()(O(log(size()))呢)
set.insert(data),在set中插入data,值得注意的是它会先检索一遍是不是已经存在data了如果是就不会插入了qwq(因为,set里没有重复元素呢qwq)
讲完了?最后说下set和multiset区别蛤
就几个成员函数的实现有点区别?
erase,multiset会把所有=data都删了
count,multiset返回的是次数,set只是蛇皮地告诉你一下它出现过没有
没了?欧克结束qwq
习题
1)random [ ]
2)sumx [ ]
3)dec [ ]
4)high card low card [ ]
关于pair
这个我会的,知识点也不多随手写几句就溜了qwq
就是个二元组,然后排序的时候是以first为第一关键字second为第二关键字的
没了?
习题
1)买蛋糕2 [ ]
关于map&multimap
map一般是用来hash啥的?它可以建立一一对应关系嘛,就是map<key,value>
然后它也有棵红黑树,可以根据key自动排序,所以你如果要查找key,是O(1)的,但是查找value的时候复杂度不怎么好看了qwq
还有就是map也不资瓷重复元素的哦qwq但是multimap资瓷qwq
然后,map的iterator也只资瓷++--,+=k不欧克哦QAQ
然后没什么好说的?直接上来讲成员函数了蛤
因为懒得打了,此处define mp make_pair
map.begin() map.end() map.empty() map.clear() map.erase()(O(size())呢)
map.insert(mp(key,value)),插入某个元素,你也可以直接用数组赋值的方式,map[key]=value 区别在于如果本来就有key值了,insert相当于没有意义的,直接赋值相当于覆盖掉原来的key值 复杂度都是O(log(size()))好像?
iterator->first iterator->second,因为map比较特殊所以港下,first就是key,second就是value
map.find(data),需要注意的是它找到是key鸭qwq
map.lower_bound() map.upper_bound,注意一下的是它也查找的是key
说下multimap和map区别
可以类比set和multiset,同样的multimap可以一个key值对应多个value,根据插入时间排序
然后还有就是不能用数组赋值了只资瓷insert
然后find返回的是第一个元素的迭代器
还有就count也差不多
还有个比较特殊的,其实map也有但没什么意义所以没讲的,函数,equal_range(x),返回的是pair(左闭右开的x区间的俩iterator),不过这个也可以用lower_bound+upper_bound实现qwq
习题
1)count [ ]
2)drawer [ ]
3)exclusive [ ]
4)match [ ]
5)game [ ]
6)double [ ]
关于queue
没什么可讲的,作用好像也不是很大×可以轻而易举地被vector替代感觉?说下成员函数就溜了我qwq
queue.size() queue.empty() queue.pop() queue.front() queue.back() queue.push(data)
queue.emplace(data),和push一样,好蛇皮啊,,,为什么一个作用要开俩函数???
queue1.swap(queue2),交换俩队列的元素,其实并不会真正使用拷贝形式进行交换,只是交换底层的数据结构
swap(queue1,queue2),太蛇皮了,和上面那个意义一样,为什么要搞俩?
关于deque
deque,就是个,双端队列,就是说可以从头插入也可以从尾插入
先对比一下deque和vector
vector通常来说常数较小,但从头插入从头删除的话只能用insert erase复杂度较高
deque常数大一些,但是它从头插入也是O(1)的复杂度就低些
总的来说如果要频繁在头搞事就用deque
不然就用vector
然后说下关于deque的几点
1)deque用[]实在肥肠方便,只有在erase和insert的时候用下iterator就好了
2)关于deque的构造,因为这个构造有点奇葩所以拎出来说下,就是你可以定义成deque<int>cjk(5),表示这个deque初始有5个0.然后还有个挺逗的,就是假如我定义了俩 deque<int>cjk(5);deque<int>goldgenius(3),就是说一个有5个0一个有3个0,然后我们可以直接赋值,cjk=goldgenius,这样就变成都只有3个0了.其实挺无聊的但就是蜜汁戳我笑点?感觉好逗啊2333333
然后就介绍下成员函数qwq
首先说下
哦这里还是解释下这个蛇皮的(size)有什么用?就是说这样的话你就是已经开了size的空间,对这些你就可以用[]修改,还有就是它会影响到push,没了
好不扯淡了真滴开始港成员函数哦qwq
deque.empty() deque.size() deque.begin() deque.end() deque.clear() deque.front() deque.back() deque.push_front() deque.push_back deque.pop_front() deque.pop_back()
应用
1)单调队列 [ ]
习题
1)滑动窗口 [ ]
2)advertisement [ ] (找不到原题oj所以用的一个相似的题目QAQ
3)最大全1子矩阵 [ ]
关于priority_queue
就是个封装的堆呢qwq
然后因为之前学dij的时候学过了大概都回了就不详细讲解了qwq
priority_queue.push(data) priority_queue.pop(data) priority_queue.top(data) priority_queue.empty() priority_queue.size()
注意一下就队列没有clear,可以自己手写一下(就empty+pop就完成了嘛qwq) 然后都是O(size())的呢
习题
1)懒羊羊吃草 [ ]
2)合并果子 [ ]
3)丑数 [ ]
4)blackbox [ ]
关于stack
关于list
然后我发现好多习题找不到...所以我就专门写了个博客记录了下题面qwq
当然题目肯定也做不成,打打代码就算了QAQ
update:
知道了一个unordered系列!
好像有unordered_map unordered_set等?先mk一下,,,没有时间落实了辣QAQ如果按俩考一落实的模式来说的话大概后天是有时间的?先随便mk一个网址趴QAQ
——19.1.21
STL库学习笔记(待补充QAQ的更多相关文章
- 位运算求最值 学习笔记 (待补充QAQ)
没有什么前言?直接进入正题qwq 俩俩异或 求最值: 建trie树 O(n)枚举每个数找这个数的最值,每次反走就成,还可以剪枝一波(如果在某位已经小于ans显然可以直接return? void Ins ...
- STL库学习笔记(一)——什么是STL?
小明是一个很牛逼的程序员,在国际标准化组织工作. 他现在正在设计新一代的C++标准,标准中有一个待实现的函数:findMax(),这个函数要求使用者输入任何类型的数据,他都能找到最大的一个. 于是他想 ...
- C++STL标准库学习笔记(三)multiset
C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...
- numpy, matplotlib库学习笔记
Numpy库学习笔记: 1.array() 创建数组或者转化数组 例如,把列表转化为数组 >>>Np.array([1,2,3,4,5]) Array([1,2,3,4,5]) ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- muduo网络库学习笔记(三)TimerQueue定时器队列
目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...
- C++STL标准库学习笔记(一)sort
前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...
- 莫队学习笔记(未完成QAQ
似乎之前讲评vjudge上的这题的时候提到过?但是并没有落实(...我发现我还有好多好多没落实?vjudge上的题目还没搞,然后之前考试的题目也都还没总结?天哪我哭了QAQ 然后这三道题我都是通过一道 ...
随机推荐
- Git把Tag推送到远程仓库
# 创建附注标签 $ git tag -a v0.1.2 -m “0.1.2版本” 列出标签 $ git tag # 在控制台打印出当前仓库的所有标签 $ git tag -l ‘v0.1.*’ # ...
- 一致性 Hash 学习与实现
普通的 Hash 解决的是什么问题? 下图是一个普通的余数法构造的哈希表. 一般在编程中使用哈希表,某个 bucket 突然就没了的概率比较小,常见的是因为负载因子太大需要增加 bucket,然后 r ...
- java模式:建造者模式
我发现很多源码很喜欢用这个模式,比如spring cloud,spring framework. 建造者模式(Builder)用以构建各种各样的对象,主要功能就是代替对象的构造函数,更加自由化. 举个 ...
- hdoj:2061
#include <iostream> #include <string> using namespace std; int main() { int n,k; double ...
- SAP 生产订单变更管理 OCM Order Changement Management
SAP OCM Order Changement Management 一.目的 订单变更管理系统是当我们的订单(生产订单.计划订单.采购订单)已经存在的时候,其物料主数据或销售数据有变更时,我们可 ...
- win10 安装node.js node.js 安装成功但npm -v 报错问题解决
错误症状官网下载node-v8 .node-v10 的msi 安装进行安装. npm -v 错误如下 0 info it worked if it ends with ok 1 verbose cli ...
- SpringBoot 推荐博客
http://412887952-qq-com.iteye.com/category/356333
- Nginx、haproxy反向代理设置
Nginx反向代理配置: #user nobody; worker_processes ; events { worker_connections ; } http { include mime.ty ...
- 茶馆小人书 (AFO)
茶馆小人书 ——AFO 乌云重重地压住了整个天际,阴风凛冽袭人,随着远方穹顶上的几声闷响,豆大的雨点便开始清洗这座城市.北方的雨,就是这么突然.任性,恰似北方人的性情,豪放不羁,一旦开始便不可收拾 ...
- python nose测试框架全面介绍十一---用例的发现
nose是怎么发现用例的??网上一大把说函数以test开头的都会自动发现,真的是这样吗???还是自己来试验下吧 首先,我们还是来看看官方文档怎么说的吧: If it looks like a test ...