「学习笔记」STL用法

STL集合

1 栈(stack)

1.1 成员函数

#include <stack>   		   //头文件
stack<elemtype> s;          //调用
unsigned int size()         //返回栈的元素个数
elemtype top()              //返回栈顶元素
void pop()                  //将栈顶元素弹出
void push(x)                //向栈中添加元素x
bool empty()                //判断栈是否为空 

1.2 单调栈应用

//1. 最基础的应用就是给定一组数,针对每个数,寻找它和它右边第一个比它大的数之间有多少个数。
//2. 给定一序列,寻找某一子序列,使得子序列中的最小值乘以子序列的长度最大。
//3. 给定一序列,寻找某一子序列,使得子序列中的最小值乘以子序列所有元素和最大。
/**
 * 本伪代码对应的是单调递减栈 
 * 共n个元素,编号为0~n-1
 */
while(栈为空) 栈顶元素出栈; //先清空栈
a[n]=-1;//保证栈内元素全部出栈
for(i=0;i<=n;i++)
{
	if(栈为空或入栈元素大于等于栈顶元素) 入栈;
	else 
	{
		while(栈非空并且栈顶元素大于等于入栈元素)
		{
			栈顶元素出栈;
			更新结果; 
		} 
		将最后一次出栈的栈顶元素(即当前元素可以拓展到的位置)入栈; 
		更新最后一次出栈的栈顶元素其对应的值; 
	} 	 
}

2 队列(queue)

2.1 普通队列

#include <queue>            //头文件
queue<elemtype> q;          //调用
unsigned int size()         //返回队列的元素个数
elemtype front()            //返回队头元素
elemtype back()             //返回队尾元素
void pop()                  //将队头元素出队
void push(x)                //向队尾添加元素x
bool empty()                //判断队列是否为空 

2.2 双端队列

/**
 * 成员函数
 */
#include <deque>             //头文件
deque<elemtype> dq;          //调用
unsigned int size()          //返回队列的元素个数
elemtype front()             //返回队头元素
elemtype back()              //返回队尾元素
void pop_front()             //将队头元素出队
void pop_back()              //将队尾元素出队
void push_front(x)           //向队头添加元素x
void push_back(x)            //向队尾添加元素x
bool empty()                 //判断队列是否为空 
void clear()                 //清空队列       O(n)
elemtype x=dq[0]             //像vector一样通过下标访问内容
/**
 * 双端队列的应用
 */
//维护固定合法区间段的最大值或最小值
deque<int> dq; //一般元素是下标
dq.clear();    //先清空队列
//单调递增队列,维护固定区间的最小值,队头为区间最小值对应的下标
//假设原数组:a[0~n-1],固定区间为k
for(int i=0;i<n;i++)
{
	while(!dq.empty()&&a[dq.back()]>a[i]){//不满足递增性质的情况
        q.pop_back();
    }
    q.push_back(i);
    while(!q.empty()&&(q.front()<i-k+1)){//队头非法的情况
        q.pop_front();
    }
    //此处更新区间结果
    if(i>=k)ans[tot++]=a[q.front()];
}
/**
 * 优先级队列
 */
#include <queue> //头文件
priority_queue<elemtype> pq; //默认大顶堆
priority_queue<elemtype,vector<elemtype>,greater<elemtype> > pq; //小顶堆
//自定义类型需要自己定义优先级比较函数
struct node {     
  int x,y;     
  bool operator < (const node& a, const node& b) const 
  {         
    return a.x > b.x;  //结构体中,x小的优先级高     
  }
};
unsigned int size()       //返回队列的元素个数
elemtype top()            //返回队头元素   
void pop()                //将队头元素出队    O(logn)
void push(x)              //向队内添加元素x   O(logn)
bool empty()              //判断队列是否为空

3 迭代器和pair

/**
 * 迭代器
 */
//可用于vector、list、set、map的遍历
vector<elemtype>::iterator it;
it begin()       //返回指向开头的迭代器
it end()         //返回指向末尾的迭代器
//1. vector、string、deque的迭代器是有加减法的;
//2. 而map、set、multimap、multiset、list的迭代器是没有加减法的。他们仅支持++it、–-it这些操作。
/**
 * pair
 */
//1. 使用pair<string, int> P来初始化或直接用make_pair(x,y)来建立一个结构体元素
//2. 第一个元素可以使用first访问,第二个元素可以使用second访问。eg: P.first和P.second

4 动态数组(vector)

#include <vector>           //头文件
vector<elemtype> v;         //调用初始化为空
vector<elemtype> v(v1);     //用另一个vector:v1来初始化,即构造一个副本
vector<elemtype> v(n,i);    //大小为n,并全部初始化为元素i(常用)
vector<elemtype> v(n);      //构造大小为n的容器,没有初始化里面的内容
vector<elemtype> v{x,y,z,k};//构造大小为4.并初始化里面的各个元素
//成员函数
unsigned int size()         //返回数组元素个数
elemtype back()             //返回末尾元素值
void push_back(x)           //向末尾添加元素x
void pop_back()             //删除末尾元素
bool empty()                //判空
void clear()                //清空数组
void insert(it,x)           //向位置it处插入元素x   O(n)
void erase(it)              //删除位置it的元素      O(n)
void resize(m)              //调整大小为m           O(n)
//函数功能类
#include <algorithm>        //头文件
swap(v[i],v[j]);            //交换元素  
sort(v.begin(),v.end());    //排序       O(nlogn)
reverse(v.begin(),v.end()); //反转	    O(n)

5 双向链表(list)

#include <list>             //头文件
list<elemtype> L;           //调用
//成员函数
unsigned int size()         //返回表的元素个数
bool empty()                //判空
void push_front(x)          //表头添加元素x
void push_back(x)           //表尾添加元素x
void pop_front()            //删除表头元素
void pop_back()             //删除表尾元素
void clear()                //清空数组             O(n)
void insert(it,x)           //向位置it处插入元素x   O(1)
void erase(it)              //删除位置it的元素      O(1)

6 集合(set)

6.1 set和multiset

//1. set是元素值进行排序的集合,所插入的元素在集合中唯一,不存在重复元素,而multiset可以存在重复元素。如果是结构体需要重载"<",来排序元素。
//2. set和multiset是由二叉搜索树实现,而且对树进行了平衡处理,使得元素在树中分布较为均匀,因此能保持搜素、插入、删除操作的复杂度在O(logn)。
#include <set>                //头文件
(multi)set<elemtype> s;       //调用
//成员函数
unsigned int size()           //返回集合元素个数
void clear()                  //删除集合内所有元素
void insert(x)                //在集合中插入元素x        O(logn)
unsigned int count(x)         //返回x值的个数            O(logn)
void erase(x)                 //删除含x的元素            O(logn)
it find(x)                    //搜索x元素,并返回指向该元素的迭代器,没有则返回end() O(logn)
//函数功能类
it s.lower_bound(x)      //返回指向元素值>=x的第一个元素位置的迭代器    O(logn)
it s.upper_bound(x)      //返回指向元素值>x的第一个元素位置的迭代器     O(logn)
pair<set<elemtype>::iterator,set<elemtype>::iterator> bounds;
bounds=s.equal_range(x)  //返回元素值=x的迭代器的区间                  O(logn)

6.2 unordered_set和unordered_multiset

//1. unordered_set是元素值不进行排序的集合,底层实现是hash原理,且与unordered_multiset的唯一区别是后者可存放重复元素。
//元素不能是自定义类型,只能是单一类型,如:int,char,string,bool
#include <unordered_set>                //头文件
unordered_(multi)set<elemtype> s;       //调用
//成员函数与set类似
unsigned int size()           //返回集合元素个数
void clear()                  //删除集合内所有元素       O(n)
void insert(x)                //在集合中插入元素x        O(1)~O(n)
unsigned int count(x)         //返回x值的个数            O(1)~O(n)
void erase(x)                 //删除含x的元素            O(1)~O(n)
it find(x)                    //搜索x元素,并返回指向该元素的迭代器,没有则返回end() O(1)~O(n)

7 键值对集合(map)

7.1 map和multimap

//1. map集合以键与值组合为元素,集合以值作为排序标准,和multimap的唯一区别是后者元素的"键"可重复。
//2. 可以使用"[ ]"来访问指定键对应的值或迭代器来访问每一对键和值。
//3. map和set一样通过平衡二叉搜索树来实现,因此元素的插入、删除、搜索以及"[ ]"运算的复杂度均为O(logn)
//4. map中的key默认是以less<>升序对元素排序(排序准则也可以修改),也就是说key必须具备operator < 对元素排序,而平常我们的用的基本上都是基本类型元素作为key,所以就不存在这个问题了。如果是结构体需要重载"<",来排序key值。
#include <map>                     //头文件
(multi)map<elemtype> m;            //调用
//成员函数
unsigned int size()                //返回集合元素个数
void clear()                       //删除集合内所有元素                   O(n)
void insert(make_pair(key,val))    //在集合中插入元素pair(key,val)        O(logn)
unsigned int count(key)            //返回被查找元素key的个数              O(logn)
void erase(key)                    //删除含键key的元素                    O(logn)
it find(x)                         //搜索与key一致的元素,并返回指向其的迭代器,没有则返回end() O(logn)
elemtype m[x]                      //可以通过下标直接访问key为x对应的val的值 O(logn)

7.2 unordered_map和unordered_multimap

//1. unordered_map是不对val进行排序的集合,底层实现是hash原理,且与unordered_multimap的唯一区别是后者可存放重复key的元素。
//2. 元素不能是自定义类型,只能是单一类型,如:int,char,string,bool
#include <unordered_map>                   //头文件
unordered_(multi)map<elemtype> m;          //调用
//成员函数与set类似
unsigned int size()                        //返回集合元素个数
void clear()                               //删除集合内所有元素                O(n)
void insert(make_pair(key,val))            //在集合中插入元素pair(key,val)     O(1)~O(n)
unsigned int count(key)                    //返回被查找元素key的个数           O(1)~O(n)
void erase(key)                            //删除含键key的元素                 O(1)~O(n)
it find(key)                    //搜索与key一致的元素,并返回指向其的迭代器,没有则返回end()  O(1)~O(n)
elemtype m[x]                   //可以通过下标直接访问key为x对应的val的值        O(1)~O(n)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值