STL常用容器的性质与函数
前言:做好心理准备,接下来的内容将会灰常长!(#>д<)ノ
推荐写得好的博客:STL详解大集合
简介:
1.stack(栈)
元素先进的后出,可以查看、删除栈顶元素的值,也可以在栈顶压入元素。
stack<int> s;
s.push(a);
函数:empty、size、pop、top、push
2.priority_queue(优先队列)
可以将元素自动排序。
priority_queue<int> q;
q.push(a);
函数:empty、size、push、top、pop
3.vector(长度不限的数组)
几乎与数组一样,但长度可以无限大,且删除一个元素的时间复杂度是O(1)。
vector<int> v;
v.push_back(a);//只能在末尾插入
函数:push_back、pop_back、at(得到编号位置的数据)、size、erase、clear、empty、swap(与另一个vector交换数据)
4.deque(双端队列)
可以在序列两端快速插入和删除元素,但在中间插入元素则会比较费时。
deque<int> d;
d.push_front(a);
d.push_back(a);
函数:front、back、push_front、pop_front、push_back、pop_back
5.list(双向链表)
可以快速地插入和删除,但是随机访问比较慢。
list<int> lt;
lt.push_back();
lt.push_front();
函数:back、front、begin(返回指向第一个元素的迭代器)、clear、empty、end(返回末尾的迭代器)、erase、insert、pop_back、pop_front、push_back、push_front、size、sort、swap
6.map(键值对)
对于“一对”元素,通过第一个元素可以调取第二个元素,有时把它当做数组来用。
map<int,int> mp;
scanf("%d",&mp[x]);
函数:begin、clear、count、empty、end、erase、find、size、swap
7.set(集合)
元素自动排序且去重,比优先队列好在删除元素快。
set<int> st;
st.insert();
函数:begin、clear、count、empty、end、erase、find、insert、size、swap
8.pair(二元组)
只有两个数,与结构体相似。
pair<int> p;
scanf("%d",&p.first());
函数:first(取一对元素中的第一个)、second(取一对元素中的第二个)
9.array(数组)
是vector的优化版,可以用下标和迭代器访问。
array<int> a;
scanf("%d",&a[x]);
函数:begin、end、size、empty、at、front、back
注意点:
1.所有的STL容器都可以成为二维三维或多维的(与数组一样),如果想让这个STL容器的变量成为多维的,需要在创建时声明(例:set<int> st[1001][11];)。遍历时,容器本身用自带的遍历方法,每个维度([1001][11]等等)用下标遍历。
2.有时候,容器还可以套容器,比如set和pair:set<pair<int,int> > st,set存储的就成了无数个pair对,在对set操作时,操作的变量就是pair了。
3.迭代器
有的STL容器需要迭代器来遍历,它的遍历方法类似数组下标,但又麻烦一些。
重要表格:
| 容器 | 对应的迭代器类型 |
|---|---|
| vector | 随机访问迭代器 |
| array | 随机访问迭代器 |
| deque | 随机访问迭代器 |
| list | 双向迭代器 |
| set | 双向迭代器 |
| map | 双向迭代器 |
| stack | 不支持迭代器 |
| queue/priority_queue | 不支持迭代器 |
| pair | 不支持迭代器 |
//举例:(vector)
vector<int> v;
for(int it = v.begin();it != v.end();it++)
{
int a = *it;//a是迭代器为it的v的值
...
}
这里不多说了,整个链接看看吧~
4.在任何STL容器前加上unordered_,会减少容器本身所花费的时间,因为容器本身调用就像使用函数一样,时间复杂度不是
好了,长不长~ 罒ω罒
以上是STL的9大容器,比赛很常用,一定要切记!!!
(该博客内容可能会继续改进哦~)