本文主要总结了常见的STL容器用法,备忘。详细请见STL用法。
1.vector
变长数组,倍增思想,系统为某一程序分配空间,所需时间与空间大小无关,与申请次数有关
a.size()
a.empty()
clear()
front()/back()
push_back()/pop_back()
begin()/end()
[]
随机取址支持比较运算 按照字典序比较
erase 复杂度
#include<vector>
vector<int> a(10,3)
//3种遍历方式
for(int i=0;i<a.size();i++)cout<<a[i]<<" ";
for(vector<int>::iterator i= a.begin();i<a.end();i++)cout<<*i<<" ";
for(auto it:a)cout<<it<<" ";
2 pair
- 可以存储二元组,类型任意
- p.first p.second
- 支持比较运算,以first为第一关键字,以second为第二关键字
- 多种属性 pair<int,pair<int,int>>
- 应用场景:
- 某个对象拥有两种属性,且需要排序
- 可以看成实现了一个二元结构体,并实现了比较函数
3 string
- 字符串加减操作
- substr(start,length)
- printf("%s\n",a.c_str()) //a.c_str() 返回起始地址
4 queue 队列
- size()
- empty()
- push()/pop()
- front()/back()
- 清空queue,重新构造
q=queue<int>()
5 priority_queue 优先队列
- 默认大根堆
priority_queue<int> heap
- 如何构建小根堆
- 黑科技,负数大法
priority_queue<int,vector<int>,greater<int>> heap
6 stack 栈
- push/pop
- empty
- top
- size()
7 deque
- size
- empty
- clear
- front/back
- push_back/pop_back
- push_front/pop_front
- begin/end
- []
8 set、multiset,
- 时间复杂度
- 基于平衡二叉树(红黑树),动态维护有序序列
- size()、empty()、clear()
- insert 函数
- find 查找函数 不存在返回end迭代器
- count()
- begin()/end() 支持
++,--
操作,返回前驱和后继 - erase
- 输入一个数,删除x 复杂度
- 输入一个迭代器,删除这个迭代器
- lower_bound() 大于等于x最小的数
- upper_bound 大于x最小的数
9 map、multimap
insert() 插入的是一个pair
erase() 输入的参数是pair 或者迭代器
find
-
[]
时间复杂度为#include<set> map<string,int> a; a["abc"]=1;
10 其他
- unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表
- 和上面类似,增删改查的时间复杂度都是
- 不支持基于排序的操作
lower_bound() upper_bound()
、++ --
11 bitset
- 经典应用场景
- 支持操作
~ & | ^
>> <<
== !=
- []
- count() 返回有多少个1
- any()判断是否至少有一个1
- none() 判断是否全为0
- set() 把所有位置1
- set(k,v)把第k位置v
- reset()把所有位置0
- flip() 等价于 ~
- flip(k) 将第k位取反