STL包含的内容很多,部分容器以及算法等等。本节主要介绍容器。
//各容器公有函数
size(); // O(1) 求长度
empty(); //O(1) 判断空
vector
#include<vector>//使用时包含头文件
//定义一维
vector<int> v//其中,int可换为其他类型,重点要掌握结构体类型。
vector<int> vec(10);//定义10个元素
vector<int> vec(10,3);//定义10个值为3
//定义二维:
vector<int> v[100]; //第一维定长,第二维可变。
vector<vector<int> > v//类似于二维数组。
//vector用法很多,这里我们列出常用的
v.push_back(i)/v.pop_back()//将元素i放在v的末尾
v.front()
v.back()
v.insert(v.begin()+i,K)//在第i个元素前面插入K
v.erase(v.begin+i)//删除第i个元素
v.resize(m)//将数组大小重整为m(可增添,可删除)
//支持比较运算,按照字典序比较
vector<int> a(3,4),b(4,3);
//结果 b < a;
//向vector输入时,通常采取临时变量temp
for(int i=0;i<n;i++){
int temp;
cin>>temp;
v.push_back(temp);
}
//做函数参数,参见高精度
pair
#include<>
//三种初始化
pair<int , string> p;//两个类型任意
p = {10,'2022'};
p = make_pair(10,'2022');
p.first; //访问第一个元素
p.second; //访问第二个元素
//支持比较运算,以first为第一关键字,second为第二关键字
//用法 当题目中涉及两个属性及以上,用pari存储
pair<int ,int >
pair<int , pair<int,int> >
string
string str;
str.clear(); //清空
str.substr(start,len); //返回子串,第二个参数可以省略
str = "2022";
str += '1';
//结果 20221 支持加减运算
cout<< str.substr(0,2);
//结果 “20”
cout<<str.substr(1);
//结果 "0221"
printf("%s",str.c_str()); //注意,利用printf输出的格式
queue
#include<queue>//使用时包含头文件
queue<int> que;//定义
//用法
que.push(a);//将元素a插入到队尾。
que.pop()//弹出队头元素
que.front()//查询队头元素
que.back()//查询队尾元素
que.size()//长度
que.empty()//判断是否为空
priority_queue
//实际是个堆
#include<vector>
#include<queue> //必须包含的文件
priority_queue<int> p; //默认大根堆
priority_queue<int,vector<int>,greater<int> >; //小根堆
p.push() //
p.pop()
p.top() //取堆顶元素
stack
#include<stack>//使用时包含头文件
//STL中,栈的定义
stack<int> s;//定义类型为int的stack
//用法
s.push(a)//将a入栈
s.pop()//栈顶元素出栈,注意返回值是void,
s.top()//返回栈顶元素
s.size()//返回栈中元素个数
s.empty()//判断是否为空,空返回1,非空返回0
deque
//双端队列,号称加强版vector 但是速度太慢
#include<deque>
deque <int> dq;
//支持如下
clear();
front()/back();
push_back()/pop_back();
push_front()/pop_front();
dq[0]; //随机访问
set
//集合set
//set特性。1.没有重复元素 2.元素升序排序
#include<set> //头文件包含set,mutiset
set<int> s;//定义。
//常用函数
s.clear()//清空集合
s.insert(x)//插入元素x,O(log n)
s.find(x)//查找元素x,返回迭代器
s.erase(value)//根据值删除,对于muitiset而言会将所有的value值都删除
s.erase(it)//根据迭代器删除
//查找函数
s.lower_bound(x)//返回迭代器(返回值>=x,且最小)
s.upper_bound(x)//返回迭代器(返回值>x,且最小)
//在未找到的情况下,都是返回s.end()
multiset<int> ms;//定义
//上述用法都可以用
//特点:元素可以重复,默认升序排序
map
#include<map>
map<int,int> ds;//创建索引为int型,值为int型。每个索引只能出现一次
//用法
//插入元素 可以利用insert插入,当成数组更简便。
ds[A]=B; //插入或修改,不是O(1)是O(log n)
//查找元素
ds.find(A);//根据索引查找对应的值,返回对应的迭代器,查不到返回end()
map<int,int>::iterator it=ds.find(A);
//删除
ds.erase(it);//可以根据迭代器,或者索引删除。
//支持
upper_bound();
lower_bound();
//迭代器访问,在利用迭代器访问的时候,是利用first,second来访问的。
map<int,int>::iterator it=m.begin();
//it->first 访问索引,it->second 访问值;
cout<<it->first<<it->second<<endl;
对于multiset来讲,键值可以重复。
hash类
#include<unordered_set>
#include<unordered_muitiset>
#include<unordered_map>
#include<unordered_multimap>
//与上面的类似, 增删改查时间复杂度是O(1)
//不支持upper_bound(), lower_bound();
bitset
//bitset 用法:压位
bitset<10000> s;
//位运算 ~,|,&,^,>>,<<,以及随机访问s[1]
count() //返回1的个数
any() //是否有1个1
none() //是否全为0
set() //全部设置为1
set(k,v) //第k位设置为v
reset() //设为0
flip() //全部取反
flip(k) //第k位取反
//用法 例如需要开辟一个10000×10000的bool矩阵,则需要100M空间.那么会超出内存限制,可以用10000×10000的bitset矩阵消耗12.5M省8倍
sort
需要注意的是sort函数的自定义排序写法。一般分三种情况,一般数组,结构体和STL容器(常用sort的有vector,string)。重点注意cmp函数参数的类型。
#include<algorithm>
//case1 普通数组
bool cmp(int a,int b){ //从小到大排序 用<
return a < b;
}
sort(a,a+10,cmp);
//case2 结构体数组
struct point(){
int x,y;
}
bool cmp(point a,point b){ //按照第一关键字 从大到小排序,参数类型是结构体类型
return a.x > b.x;
}
sort(a,a+10,cmp);
//case3 vector数组
vector<int> a;
bool cmp(int a,int b){ //vector数组从小到大排序,因为vector是int类型
return a < b;
}
sort(a.begin(),a.end(),cmp);
结论,对于vector数组和普通数组而言,cmp参数的类型和数组中元素的类型一致。而对于结构体而言,需要填写结构体类型。