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_,会减少容器本身所花费的时间,因为容器本身调用就像使用函数一样,时间复杂度不是O(1)

好了,长不长~ 罒ω罒

以上是STL的9大容器,比赛很常用,一定要切记!!!

(该博客内容可能会继续改进哦~)