STL

2021.5.16修改

STL

STL,其实是一种容器,是c++自带的

迭代器

首先在学STL之前,我们必须得明白什么是迭代器
官方所说,迭代器就是一个指针
我自己理解的迭代器:就是指有两个端口,一个端口是STL的,另一个是自己带的
在迭代器中,要想定义一个迭代器的第二个端口,就必须使用
STL名 <类型>::iterator 端口名;
比如:vector ::iterator i;
那么第一个端口怎么弄?其实就是在容器库里面自动保存呢,有固定的,迭代器之间相连,否则可以直接使用
使用迭代器端口的时候必须加上*号

重载<运算符

queue与priority_queue
priority_queue中存储的元素类型必须定于小于号,较大元素会放在堆顶,内置的int,string等类型本身就可以比较大小,如果使用自己定义的结构体类型 ,需要重载<运算符
其实就有点像sort排序里面的cmp函数

struct node{
	int id;
	double x,y;
};
const double eps=1e-8;
bool operator <(const poi &a,const poi &b)
{
	return a.x>b.x;
}

Pair

它的中文意思是一对,也就是说他只能存储两个数据
Pair<第一个数据类型,第二个数据类型>变量名;
Pair的库是#include"utility"
First与second是来存储两个数据的
Pair进行比较大小的话,两个数据的类型不一样就没法比较
pair基本上和map一起使用

Map

map基于hash和pair的操作
它提供一对一的hash,是一个键值的映射,内部实现是一个红黑树,存储只能是一对一对的存储
size/empty/clear/begin/end这些操作都和其他的容器一样
insert/erase 分别为插入删除,insert的使用为insert(make_pair(1,2)) erase是删除这个元素
find迭代器,使用查找变量名的位置,不存在返回最后一个元素
P.S.下面的例题:给定n个字符串,m个查询,查询一个字符串出现的次数

int main()
{
	map<int,int> m;
	char st[25];
	for(int i=1;i<=n;i++)
		cin>>st,m[st]++;//输入并且映射
	for(int i=1;i<=n;i++)
		cin>>st;
		if(m.find(st)==m.end()) cout<<0<<endl;
		else cout<<m[st]<<endl;//输出键值
}

Set &multiset

set是一个有序集合,元素不能允许重复,multiset是一个有序多重集合,内部实现是棵红黑树
set和multiset不支持随机访问,即s[1]这个样子
set的操作基本上和multiset
set基本时间的操作就是O(log n)

begin返回指向最小元素位置
end返回最大元素的下一个位置
clear清除所有元素
count返回某个值元素的个数
empty判断为空
find查找某个元素的位置
lower_bound/upper_bound 二分查找

Vector

Vector向量,不定长数组,有点类似于字符串(string),不限制长度。他的内部实现类似于倍增思想。
vector支持随机访问,即对于然亦的下标,可以像数组那样用[i]取值,但是它并不是链表,并不支持在任意一个地方插入,只能允许在最前面或者最后面插入

vector a; //定义一个数组a,数量不限制
不限制
vector b[100];//定义100个数组b,每一个的长度不限制

刚才理解了迭代器,那么vector的迭代端口是什么?

begin/end/front/back

这些都得使用迭代器的另一个端口才能使用,不然可以直接使用

A.size()元素的大小也就是个数
A.clear()将其清空
A.pop_back()删除末尾元素,大小也就减一
A.push_back()在末尾添加元素

int main()
{
	
	a.push_back(1);
	a.push_back(2);
	a.push_back(4);//压入1 2 4 
	a.pop_back(); //弹出4 
	cout<<a.front()<<endl;//输出第一个元素 1
	for(vector<int>::iterator i=a.begin();i!=a.end();i++)//迭代器两个端口链接 
	{
		cout<<*i<<endl; 
	}
}

dequeue

双端队列,支持在两端高效插入或者删除元素连续线性存储空间,即可以从队首插入元素,也可以在队尾插入元素
能够实现线性插入和删除,以及常数复杂的随机访问
[] 随机访问
begin/end 头尾迭代器
front/back 队头队尾元素
push_back 从队尾入队
push_front 从队头入队
pop_back 从队头出队
pop_front 从队尾出队
clear 清空队列
以上操作除了clear的时间复杂度是O(n),其他全部都是O(1)

list

是指双向链表
a.front()返回第一个元素
a.back()返回最后一个元素

reverse反转函数

reverse(a+1,a+n+1)

random_shuffle 随机打乱函数

random_shuffle(a+1,a+n+1)

unique去重函数

返回的是去重之后的个数

next_permutation字典序下一个排列

next_permutation(a+1,a+n+1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值