前言
STL,即Standard Template Library。相信大家都知道这是啥,以下为基本的STL模板总结。
queue
q u e u e queue queue,队列,是实现"先进先出"的容器,,不可用下标或迭代器访问。
头文件:
#include <queue>
定义方式:
queue <typename> name;
其中 t y p e n a m e typename typename指数据类型(如 i n t int int、 c h a r char char、结构体、容器等), n a m e name name是定义的容器名,下同。
常用函数
1
1
1、
p
u
s
h
(
x
)
push(x)
push(x)。将
x
x
x入队——
O
(
1
)
O(1)
O(1)。
2
2
2、
p
o
p
(
)
pop()
pop()。将队首元素出队——
O
(
1
)
O(1)
O(1)。
3
3
3、
f
r
o
n
t
(
)
front()
front()。获得队首元素(不删除)——
O
(
1
)
O(1)
O(1)。
4
4
4、
b
a
c
k
(
)
back()
back()。获得队尾元素(不删除)——
O
(
1
)
O(1)
O(1)。
5
5
5、
s
i
z
e
(
)
size()
size()。获得队列中元素个数——
O
(
1
)
O(1)
O(1)。
6
6
6、
e
m
p
t
y
(
)
empty()
empty()。判断队列是否为空,空返回
t
r
u
e
true
true,反之返回
f
a
l
s
e
false
false——
O
(
1
)
O(1)
O(1)。
补充:容器间的"="——
O
(
n
)
O(n)
O(n)。
stack
s
t
a
c
k
stack
stack,栈,是实现“后进先出”的容器,不可用下标或迭代器访问。
头文件:
#include <stack>
定义方式:
stack <typename> name;
常用函数
1
1
1、
p
u
s
h
(
x
)
push(x)
push(x)。将
x
x
x压栈——
O
(
1
)
O(1)
O(1)。
2
2
2、
p
o
p
(
)
pop()
pop()。弹出栈顶元素——
O
(
1
)
O(1)
O(1)。
3
3
3、
t
o
p
(
)
top()
top()。获得栈顶元素(不弹出)——
O
(
1
)
O(1)
O(1)。
5
5
5、
s
i
z
e
(
)
size()
size()。获得栈中元素个数——
O
(
1
)
O(1)
O(1)。
6
6
6、
e
m
p
t
y
(
)
empty()
empty()。判断栈是否为空,空返回
t
r
u
e
true
true,反之返回
f
a
l
s
e
false
false——
O
(
1
)
O(1)
O(1)。
vector
v e c t o r vector vector,直译为向量,可理解为变长数组(动态数组),基于倍增思想,可用下标和迭代器访问。
头文件:
#include <vector>
定义方式
vector <typename> name;
vector的访问
1、数组下标访问:例如,定义动态数组
v
e
c
vec
vec,可以使用
v
e
c
[
i
]
vec[i]
vec[i]来访问它的第(
i
+
1
i+1
i+1)个元素。(
0
≤
i
<
v
e
c
.
s
i
z
e
0 \leq i < vec.size
0≤i<vec.size)
2、迭代器访问:可以将迭代器理解为一种类似指针的变量,使用前需提前定义,定义为:
vector <typename>::iterator it;
这里的
i
t
it
it是我们定义的迭代器的名字。但迭代器到底怎么用呢?见以下例子:
输出
v
e
c
t
o
r
vector
vector中的所有值。
法一:
for(int i = 0; i < vec.size(); i ++) {
printf("%d ", vec[i]);
}
法二:
vector <int>::iterator it;
for(it = vec.begin(); it != vec.end(); it ++) {
printf("%d ", (*it));
}
读者需要注意,这里不能写成 i t < = v e c . e n d ( ) it <= vec.end() it<=vec.end(),可以想想为什么。
常用函数
1
1
1、
p
u
s
h
_
b
a
c
k
(
x
)
push\_back(x)
push_back(x)。将
x
x
x添加到
v
e
c
t
o
r
vector
vector尾端——时间复杂度可近似地看成
O
(
1
)
O(1)
O(1)。
2
2
2、
p
o
p
_
b
a
c
k
(
)
pop\_back()
pop_back()。将
v
e
c
t
o
r
vector
vector尾端的元素删掉——
O
(
1
)
O(1)
O(1)。
3
3
3、
s
i
z
e
(
)
size()
size()。获得
v
e
c
t
o
r
vector
vector中元素个数——
O
(
1
)
O(1)
O(1)。
4
4
4、
c
l
e
a
r
clear
clear。清空
v
e
c
t
o
r
vector
vector中元素——
O
(
n
)
O(n)
O(n)。
5
5
5、
i
n
s
e
r
t
(
i
t
,
x
)
insert(it, x)
insert(it,x)。
i
n
s
e
r
t
insert
insert用来向
v
e
c
t
o
r
vector
vector任意处插入元素——
O
(
n
)
O(n)
O(n)。
例如以下代码输出:
1
2
0
3
4
5
1\ 2\ 0\ 3\ 4\ 5
1 2 0 3 4 5。
vector <int> v;
for(int i = 1; i <= 5; i ++) {
v.push_back(i);
}
vector <int>::iterator it = v.begin();
v.insert(it + 2, 0);
for(it = v.begin(); it != v.end(); it ++) {
printf("%d ", (*it));
}
6
6
6、
e
r
a
s
e
(
i
t
)
erase(it)
erase(it)或
e
r
a
s
e
(
f
i
r
s
t
,
l
a
s
t
)
erase(first, last)
erase(first,last)。第一个用于删除单个元素,第二个删除左闭右开区间内的所有元素——
O
(
n
)
O(n)
O(n)
7
7
7、
r
e
s
i
z
e
(
x
)
resize(x)
resize(x)。改变
v
e
c
t
o
r
vector
vector的长度,释放空间。——
O
(
n
)
O(n)
O(n)。
priority_queue
p r i o r i t y _ q u e u e priority\_queue priority_queue,优先队列,其内部是一个二叉堆,,不可用下标或迭代器访问。
头文件:
#include <queue>
定义方式:
1.大根二叉堆
priority_queue <typename> name;
或(注意最后一个“>”前的空格不能省)
priority_queue <typename, vector <typename>, less <typename> > name;
2.小根二叉堆(注意最后一个“>”前的空格不能省)
priority_queue <typename, vector <typename>, greater <typename>> name;
顺便说一下,结构体的优先队列需要重载运算符。
struct Node {
int tmp, num;
bool operator<(const Node x) const {
return tmp < x.tmp;//这里写的大根堆,小根堆需调换符号
}
};
priority_queue <Node> p_que;
常用函数
1
1
1、
p
u
s
h
(
x
)
push(x)
push(x) 。将x加入优先队列——
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)。
2
2
2、
t
o
p
(
)
top()
top()。获取堆顶元素——
O
(
1
)
O(1)
O(1)。
3
3
3、
p
o
p
(
)
pop()
pop()。将堆顶元素出队——
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)。
map
m a p map map,映射,可用下标和迭代器访问,内部用红黑树实现。
头文件
#include <map>
定义方式
map <typename1, typename2> name;
其中,
t
y
p
e
n
a
m
e
1
typename1
typename1为映射前的类型(键
k
e
y
key
key),
t
y
p
e
n
a
m
e
2
typename2
typename2为映射后的类型(值
v
a
l
u
e
value
value)。
注意:
m
a
p
map
map在建立映射的同时,会自动按键从小到大排序,
s
e
t
set
set也是,因为其内部使用红黑树实现。
常用函数
1
1
1、
f
i
n
d
(
)
find()
find()。返回键为
k
e
y
key
key的映射的迭代器——
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)。
2
2
2、
s
i
z
e
(
)
size()
size()。获取映射的对数——
O
(
1
)
O(1)
O(1)。
3
3
3、
e
r
a
s
e
(
)
erase()
erase()。可删除单个或多个元素。删除单个元素可用
e
r
a
s
e
(
i
t
)
erase(it)
erase(it)(
i
t
it
it为要删除元素的迭代器)——
O
(
1
)
O(1)
O(1)。也可以用
e
r
a
s
e
(
k
e
y
)
erase(key)
erase(key)(
k
e
y
key
key为要删除元素的键——
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n))。删除多个元素用
e
r
a
s
e
(
f
i
r
s
t
,
l
a
s
t
)
erase(first, last)
erase(first,last)(左闭右开,
f
i
r
s
t
first
first和
l
a
s
t
last
last为迭代器)——
O
(
n
)
O(n)
O(n)。
4
4
4、
c
l
e
a
r
(
)
clear()
clear()。清空
m
a
p
map
map——
O
(
n
)
O(n)
O(n)。
5
5
5、
c
o
u
n
t
(
x
)
count(x)
count(x)。查找
m
a
p
map
map 中有没有
x
x
x 这个元素,有则返回
1
1
1 ,否则返回
0
0
0 。
pair
p a i r pair pair,相当于二元结构体,即
struct Node {
typename1 first;
typename2 second;
};
头文件
#include <utility>
但是因为 m a p map map的内部实现涉及 p a i r pair pair,所以添加 m a p map map头文件会自动添加 u t i l i t y utility utility头文件,即
#include <map>
定义方式
pair <typename1, typename2> name;
初始化
写法一
make_pair("AK", 666);
写法二
pair <string, int> p("AK", 666);
写法三
pair <string, int> p;
p.first = "AK";
p.second = 666;
注意, p a i r pair pair可以直接做比较运算,比较的规则:先用 f i r s t first first比较,若 f i r s t first first相等就用 s e c o n d second second比较。
map+pair
因为 m a p map map可以自动按键值排序,而 p a i r pair pair可以比较大小,所以 p a i r pair pair可以插入到同类型中的 m a p map map中去并根据 f i r s t first first排序。(如果 f i r s t first first相同则根据 m a p map map键值唯一的性质,只保留先输入的二元组)。
set
s e t set set,集合,可自动去重并按升序排序,内部用红黑树实现,只能通过迭代器访问。
头文件
#include <set>
定义方式
set <typename> name;
常用函数
1
1
1、
i
n
s
e
r
t
(
x
)
insert(x)
insert(x)。将
x
x
x插入
s
e
t
set
set中,并自动递增和去重——
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)。
2
2
2、
s
i
z
e
(
)
size()
size()。获取
s
e
t
set
set中元素个数。——
O
(
1
)
O(1)
O(1)。
3
3
3、
f
i
n
d
(
x
)
find(x)
find(x)。返回
s
e
t
set
set中对应值的迭代器——
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)。若这个值不在
s
e
t
set
set中,返回
s
.
e
n
d
(
)
s.end()
s.end()。
4
4
4、
c
l
e
a
r
(
)
clear()
clear()。清空
s
e
t
set
set中的所有元素。——
O
(
n
)
O(n)
O(n)。
5
5
5、
e
r
a
s
e
(
)
erase()
erase()。可删除单个或多个元素。删除单个元素可用
e
r
a
s
e
(
i
t
)
erase(it)
erase(it)(
i
t
it
it为要删除元素的迭代器)——
O
(
1
)
O(1)
O(1)。也可以用
e
r
a
s
e
(
x
)
erase(x)
erase(x)(
x
x
x为要删除元素的值——
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n))。删除多个元素用
e
r
a
s
e
(
f
i
r
s
t
,
l
a
s
t
)
erase(first, last)
erase(first,last)(左闭右开,
f
i
r
s
t
first
first和
l
a
s
t
last
last为迭代器)——
O
(
n
)
O(n)
O(n)。