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)
4万+

被折叠的 条评论
为什么被折叠?



