STL容器用法大全
- vector ( 动态数组,可支持随意访问 )
功能 | 写法 | 时间复杂度 |
定义vector容器 | vector<Type>v | / |
元素个数 | v.size ( ) | O ( 1 ) |
尾部增加元素 | v.push_back( <元素> ) | O ( 1 ) |
在第i个元素前面插入k | v.insert ( a.begin ( ) +i , k ) | O ( N ) |
尾部删除元素 | v.pop_back( <元素> ) | O ( 1 ) |
删除区间[ i , j-1 ]的元素 | v.erase ( a.begin () + i , a.begin ( ) + j) | O ( N ) |
判断是否为空 | v.empty ( ) | O ( 1 ) |
清空容器 | v.clear ( ) | O ( N ) |
返回首/末的元素 | v.front ( ) / v.back ( ) | O ( 1 ) |
打印第i个元素 | cout << v[ i ] | O ( 1 ) |
翻转元素 | reverse ( v.begin ( ) , v.end ( ) ) | O ( N ) |
排序 | sort ( v.begin ( ) , v.end ( ) ) | O ( N*LogN) |
2.set(集合,底层是平衡二叉树,加入元素后自动排序)
- 定义 : set < Type > st ;
- 插入/删除元素x : st . insert ( x ) / st . erase ( x )
迭代器和auto的使用:
Ⅰ.定位 :st . begin ( ) —— 首位 / st . rbegin( ) —— 反向迭代器首位(末位)
Ⅱ.强制转换——*
遍历:
for ( auto it = st.begin ( ) ; it != st.end ( ) ; it++ ) cout << *it << endl;
(所以此时可以清晰地理解*max_element(<左闭区间,右开区间>)和*min_element(<左闭区间,右开区间>)的*号含义)
Ⅲ.位置的移动——自增、自减符号(++ 、--)
上一位:*- -it 下一位:*++ it (绝对不能使用it+=1或者it-=1!!!)
Ⅳ.函数的使用
返回容器内的元素个数 : st.size ( )
查找一个元素:st . find ( )
if ( st.find ( ) != st.end( ) ) (当查找不到时会返回st.end ( ))
提取容器的长度 : st . size ( )
二分查找:st.upper_bound ( x ) ( 找到第一个大于x的下标 )
st.lower_bound ( x ) ( 找到第一个大于等于x的下标 )
=> 强制转化: *st.upper_bound ( x ) ( 找到第一个大于x的值 )
*st.lower_bound ( x ) ( 找到第一个大于等于x的值 )
=> 推广 :找到离x最近的左边元素元素为*--st.lower_bound ( x )
( 当不存在时则会返回st.end ( ),st.end( )指的不是set的最后一位,而是最后一位的后一位,可理解为不存在,通常情况下st.end( )等于st.size( ) )
3.multiset(多重集合,可重复的set容器,可完全代替优先队列的功能)
注意两种erase:
insert(x),insert(x),erase(x)之后没有x了(erase是全删)
insert(x),insert(x),erase(s.find(x))后仅剩一个x(删除一个找到的x)
4.map
- 定义 : map < Type1 , Type2 > mp ; (注意,如果是字符串类型只能使用string而不能使用char数组)
- map可理解为字典的映射,其中Type1代表键的类型,Type2代表值的类型
- map的遍历:
对于已赋键值的数对,可按字典大小进行遍历——
for(auto it : mp) cout << it.first << " " << it.second ;
map本质上可以看做容器pair,first和second分别对应键和值!
5.queue(队列,特点 :先进先出)
- 定义 : queue < Type > q ;
- STL容器——
- 插入 / 删除x : q.push ( x ) / q. pop ( x )
- 返回队列的第一个/最后一个元素 : q. front ( ) / q. back ( )
- 判断队列是否为空 : q.empty ( )
- 返回容器内的元素个数 : q.size ( )
- 数组写法(推荐)
- 初始化 : int head = 0 , tail = 0 ; [ head , tail ]
- push( x ) : a [ ++tail ] = x ; pop ( x ) : head++;
- 当前第k个元素 : a [ head + k - 1 ]
6. priority_queue ( 底层用大小根堆实现,只需log(n)的时间动态地维护数据的有序性 )
⑴ 定义:
Ⅰ. priority_queue < Type > q (大根堆,默认降序)
Ⅱ . priority_queue < Type , vector< Type > , less< Type >>(大根堆,默认降序)
priority_queue < Type , vector< Type > , greater< Type >>(小根堆,默认升序)
Ⅲ. priority_queue < node , vector < node > , cmp> (自定义结构体类型排序)
例 :
struct node{ // 结构体定义
string name;
int price;
};
struct cmp{ // 默认排序
bool operator() (node f1,node f2){
return f1.price > f2.price ;
}
}
priority_queue < node , vector < node > , cmp >; //优先队列嵌套结构体及其排序
⑵操作:
Ⅰ. 插入 / 删除x : q.push ( x ) / q. pop ( x )
Ⅱ . 返回队列的第一个/最后一个元素 : q. top ( )
Ⅲ . 判断队列是否为空 : q.empty ( )
Ⅳ. 返回容器内的元素个数 : q.size ( )
7.stack(特点 :先进后出)
- 定义 : stack < Type > s ;
- STL容器——
- 插入 / 删除x : s.push ( x ) / s. pop ( x )
- 返回队列的第一个元素 : s. top ( )
- 判断队列是否为空 : s.empty ( )
- 返回容器内的元素个数 : s.size ( )
- 数组写法(推荐)
- 初始化 : int top = 0
- push( x ) : a [ ++top ] = x ; pop ( x ) : top++;
- 当前栈顶元素:a [ top ]