震惊!全网最详细的STL总结!

前言

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 0i<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)

完结撒花,谢谢观看。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值