STL常用
一.vector
1. 应用
用于普通数组会超内存的情况
以邻接矩阵的方式存储图
2. 定义:typename可以是int,double,char,结构体
3. 元素访问
下标访问
迭代器访问:vector< typename >::iterator it;
4. 函数
#include<vector>
using namespace std;
vector<typename>name;//定义
vector<vector<int> >name;//如果typename也是一个vector,>>之间要有空格
vector<typename>name[maxn];//二维vector< typename >name[maxn],有一维长度固定为maxn,无法改变
int main()
{
push_back();//vector后加一个元素
pop_back();//删去vector的尾元素
size();//获得vector中元素个数
clear();//清空
insert(it,x);//向vector任意迭代器it处插入一个元素x
erase(it);//删去单个元素
erase(first,last);//删去区间[first,last)内的所有元素
return 0;
}
二.set
1. 应用:去重,自动排序
2. 定义:typename类型同vector;
3. 元素访问:只能用迭代器set< typename >::iterator it;
4. 函数:
#include<set>//头文件
using namespace std;
set<typename>name;//定义
int main()
{
insert(x);//将x插入set容器中,并自动排序,去重
find(value);//返回对应值为value的迭代器
size();//获得vector中元素个数
//删去单个元素
name.erase(it);//
name.erase(value);//
name.erase(first,last);//删去区间[first,last)内的所有元素
clear();//清空
insert(it,x);//向vector任意迭代器it处插入一个元素x
return 0;
}
三.string
1. 应用
代替一般字符数组char str[];
2. 访问:
通过下标访问
注:如果要读入或者输出,只能用cin,cout
迭代器访问:string::iterator it;
string和vector一样,支持直接对迭代器进行加减某个数
如:str.begin()+3;
3. 函数:
#include<string>
using namespace std;
string str;
int main()
{
str1+=str2;//直接将str1,str2连起来,拼到str1上
str1==str2;//类似的操作还有:!=,<,<=,>,>=
length(str);//=size(str);
insert(pos,str);//在pos位置上插入str
insert(it,it1,it2)//it为字符串要插入的位置,it1和it2分别是待插入字符串的首尾
str.erase(it);
str.erase(first,last);
str.erase(pos,len);//pos是开始删除的位置,len是要删除的字符串的长度
str.clear();
substr(pos,len);//返回从pos开始,长度为len的字符串
string::npos//一个常数,值为-1,实际也可做unsigned_int的最大值
str.find(str2);//str2是str子串,返回子串第一次出现的位置,否则返回string::npos
str.find(pos,str2);//从pos开始找str2,其他同上
str.replace(pos,len,str2);//将从pos位置开始长为len的子串替换为str2
return 0;
}
四.map
1.应用:可将任何基本类型映射到任何基本类型
2.访问:
通过下标访问:mp[‘c’]=a,注意引号
通过迭代器访问:map<typename1,typename2>::iterator it;
可用it->first访问键,it->second访问值
另外,map会以键的自大到小排序
3.函数
#include<map>
using namespace std;
map<typename1,typename2>mp;//name1是键的类型,name2是值的类型
int main()
{
find(key);//返回key映射的迭代器
mp.erase(it);//同上
mp.erase(key);//key为要删除的映射的键
mp.erase(first,last);//同上
size();
clear();
return 0;
}
五.queue
1.思想:先进先出
2.访问:只能用front()访问队首,back()访问队尾
3.函数:
#include<queue>
using namespace std;
queue<typename>q;//name1是键的类型,name2是值的类型
int main()
{
q.push();//入队
q.front();//获取队首
q.back();//获取队尾
q.pop();//出队
q.empty();//判断是否为空
q.size();
return 0;
}
六.priority_queue
1.访问:只能用top()访问队首元素
2.函数
#include<queue>
using namespace std;
priority_queue<typename>q;//name1是键的类型,name2是值的类型
int main()
{
q.push();//入队
q.top();//获取队首
q.pop();//出队
q.empty();//判断是否为空
q.size();
return 0;
}
3.优先级设置
(1)基本数据类型:
priority_queue<int,vector<int>,less<int>> q;
priority_queue<typename>q;//二者等价
less< int >表示数字越大优先级越大,great< int >刚好相反;
char行根据字典序来排序
(2)结构体:
struct node
{
string a;
int b;
friend bool operator<(node x,node y)//重载小于号,即对小于符号重新定义
{
return x.b<y.b;
}
};
注:1.此函数与sort中cmp的效果刚好相反
2.若结构体内数据较为庞大,可使用引用来提高效率,即加上“const”“&”,如:
friend bool operator<(const node &x,const node &y)
{
return x.b<y.b;
}
七.unique
1.应用:去重
具体来说,unique可以“删除”相邻元素中的所有重复元素,让每个不同值的元素只留下一个,但是这里的删除也不是真的删除,只是将不相同的元素往前移,占领了之前相同元素的位置,而那些相同的元素则可怜巴巴的被挤到最后面去了。又由于它只能“删除”相邻元素中的所有重复元素,所以我们一般使用前会对数组先进行排序操作
2.使用方法:unique(数组名,数组名+数组长度)(区间左闭右开),和sort用法类似
int a[maxn],n;
unique(a,a+n)-(a+1);
返回的是去重后数组的长度
3.unique_copy:将去重后的数组储存到另一个数组中,并且没有保留重复的元素,重复元素所占位置全部变成了随机数
int a[maxn],c[maxn],n;
unique_copy(a,a+n,c);
将a中去重元素赋值到c中
当然,其实也可以直接用STL中的erase函数,直接将a数组中后面的重复的数去掉
int newend,a[maxn];
newend = unique(a,a+n);
a.erase(newend,a+n);