C++STL语法速记
C++STL语法速记
文章目录
- C++STL语法速记
- 前言
- vector
- string
- queue
- priority_queue
- stack
- deque
- set,map,multiset、multimap
- unordered_set、unordered_map、unordered_multiset、unordered_multimap
- 参考博客
前言
笔者最近开始重刷算法题,鉴于C++语法的便利,笔者决定简单学习其语法用作写算法题的一个工具,这里不会涉及有关C++底层的内容,大多是一些容器的语法记录。
vector
这个是C++中非常常用的一个语法工具,也就是OC中的一个可变数组,下面笔者简单介绍一下他的一个用法。
- 创建方式:
vector<int> num(10, 1) //vector<数据类型> 变量名(数组大小,数组初始化时每个元素的默认值)
//这里也就是创建一个数组,初始化时设置数组内的每一个元素的值为1
- 返回空数组:
return {} // C11的一个标准返回
- 常用的方法:
num.size() // 返回一个大小
num.empty() // 判断是否为空
num.clear() // 清空容器,让他大小为0
num.front() //第一个元素
num.back() //最后一个元素
num.push_back() // 给容器最末位置添加一个元素
num.pop_back() //删除最后一个元素
num.lower_bound(a.begin(), a.end(), x)/upper_bound(a.begin(), a.end(), x) //返回大于等于x的最小的数的迭代器/返回大于x的最小的数的迭代器。
//注意:以上size()/empty()两个接口在本文章所介绍到的容器中都有着相同的接口,且时间复杂度均为O(1),以下不再赘述。
string
c++的字符串拼接有语法🍬:可以用加法来拼接。
- 常用方法:
num.substr(start, Length) //返回的是字符串的子串,第一个参数start为子串在原字符串中的起始位置,第二个参数Length为子串的长度,特殊的,如果Length十分大,超过原串的最后一个字符,则返回到最后一个字符为止,省略第二个参数也是返回到最后一个字符为止。实质上就是c的字符串切割函数
num.c_str() //用于输出字符串的首元素的地址
num.length() // 返回长度
num.size() // 返回长度
num.push_back() //给最后的位置添加数据
num.pop_back() //移除最后的一个元素
num.erase(p, n) //移除从p为索引开始的包括p的长度为n的连续字符
num.find(c) //找到a中字符c第一次出现的一个下标,如果没有就返回-1
queue
C++封装了一个队列
- 创建方式
queue<元素类型> 队列名
queue<int> que //使用前记得导入头文件#include <queue>
- 常用方法
num.push() //入队
num.pop() // 出队
num.back() // 返回队尾元素
num.pop() //弹出队首元素
priority_queue
C++实现并封装了优先队列,也就是堆,默认是大根堆,下面介绍相关接口的用法以及定义方式。
- 常用方法
que.push() // 向堆中插入一个元素。
que.top() // 返回堆顶元素。
que.pop() // 弹出堆顶元素。
定义小根堆也就是插入对应的一个负值。(直接利用了大根堆的一个特性)
stack
C++分装了一个栈:
stack<int> stack
- 常用方法:
push() //推入栈
pop() //出栈
top() //返回栈顶元素
deque
这里其实就是一个双端队列,支持在头位置和尾位置进行一个增删改查
- 常用方法:
clear() //清空元素
front() //返回队列头位置元素
back() //返回最后一个位置的元素
push_back()||pop_back() //在尾增删元素
pop_front()||push_front() // 在队首位置增删元素
begin()|end() //支持迭代器
set,map,multiset、multimap
基于平衡二叉树(红黑树)实现,动态的维护一组有序序列
注意:含有multi
前缀的容器里,元素可以重复出现。
涉及到增删改查的操作时间复杂度绝大部分是O(logn)
级别的
- 常用方法:
//set和multiset的常用接口:
insert() //插入一个数。
find() //查找一个数,没找到时返回end()的值。
count() //返回一个数出现的次数。
erase() //①输入一个数x,删除所有的x,时间复杂度O(k+logn);②输入一个迭代器,删除这个迭代器。
s.lower_bound(x)/s.upper_bound(x) //返回大于等于x的最小的数的迭代器/返回大于x的最小的数的迭代器。
//map和multimap的常用接口:
insert() //插入的数据类型为pair。
erase() //输入的参数类型为pair()或迭代器。
find() //查找一个数,不存在时返回end()的值。
//map支持[]访问,multimap由于可以存在键相同的pair,故不支持[]访问 。 其实就和OC里的字典一样
lower_bound()/upper_bound() //返回大于等于x的最小的数的迭代器/返回大于x的最小的数的迭代器。
unordered_set、unordered_map、unordered_multiset、unordered_multimap
基于哈希表实现的容器,内部是无序的。
注意:含有multi
前缀的容器里,元素可以重复出现。
所涉及的基本操作的时间复杂度基本上是O(1)
级别的。
这里的大部分功能都比前面介绍的大致类似,这里笔者就不多赘述了,其实也就是一个map。
这里笔者引用一段话来介绍一下这里的两者的一个底层区别,方便我们在不同的情况采用不同的一个数据结构
- map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素,因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行这样的操作,故红黑树的效率决定了map的效率。
- unordered_map:
unordered_map
内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的
所以如果有顺序要求的话我们呢就采用map,否则就采用unorderer_map。
参考博客
- C++语法速记