STL总结
1. vector()
头文件:include<vector>
定义:动态数组
- vector <int> name;
- vector <int> name[10];类似二维数组,一个维度长度固定
- vector <vector< int> > name;两个维度的长度都不固定
vector内元素的访问:
以vector< int> name为例
- 下标访问:
通过name[i]; - 通过迭代器访问:
vector < int>::iterator it = name.begin();
name[i] = *(it+i)
- 只有vector和string才能用name.begin()+3这种写法
常用函数:
- push_back()
在vector最后添加元素。 O(1) - pop——back()
删除vector的尾元素。 O(1) - size()
元素个数。O(1) - clear()
清空所有元素。 O(N) - insert(it,x)
向迭代器it处插入x O(N) - erase()
- 删除单个元素erase(it) O(N)
- 删除区间内元素erase(first,last) O(N)
name.erase(name.begin(),name.end()) = name.clear()
2. set()
定义:元素有序,不重复的容器
- set< int> name
set内元素的访问:
- 只能通过迭代器访问,不支持*(it+i)
for(set< int>::iterator it = name.begin();it!=name.end();it++)
printf("%d ",*it);
常用函数:
- insert(x)
将x插入set中自动排序去重。 O(logN) - find(value)
返回set中值为value的迭代器 O(logN) - erase()
- 删除单个元素
(1). erase(it) it为迭代器,一般结合find函数来用 O(1)
name.erase(name.find(100));
(2). erase(value)
value为元素的值。 O(logN) - 删除一个区间内的所有元素
name.erase(first,last) O(last - first)
- size()
set内元素的个数 O(1) - clear()
清除所有元素。 O(N)
3.string
头文件include<string>
定义:
string str
string中内容的访问:
- 通过下标访问
读入和输出整个字符串只能用cin,cout
或者是通过c_str()将string转换成字符串数组
printf("%s",str.c_str());
- 通过迭代器访问
string::iterator it
for(it = str.begin();it!=name.end();it++)
printf("%c",*it);
常用函数:
- +
实现字符串拼接 - > < <= >= !=
实现字符串的比较 - length() / size() O(1)
获取字符串长度 - insert() O(N)
(1)insert(pos,string)
在pos号位置插入字符串string
(2)insert(it,it2,it3)
it为原字符串待插入位置,it2,it3为待插字符串首尾迭代器 - erase() O(N)
- str.erase(it)
删除单个元素,it为迭代器 - str.erase(pos,length)
删除一个区间的元素,pos为起始位置,length为删除字符个数
eg:str.erase(3,2);
- clear() O(1)
清空string中的元素 - substr()
substr(pos,len)返回从pos位开始长度为len的子串O(len) - string::npos值为-1或unsigned_int的最大值,作为find函数失配的返回值
- find() O(mn) (mn为两字符串的长度)
- eg:str.find(str2);
若str2是str的字串,返回第一次出现的位置
否则返回string::npos - str.find(str2,pos)
从pos位开始匹配str2
- replace()
- str.replace(pos,len,str2)
把str从pos位开始长度为len的字符替换为str2 - str.replace(it1,it2,str2)
把迭代器[it1,it2)范围内的字串替换为str2
map
定义:映射
map<typename1,typename2> mp
第一个是键的类型,第二个是值的类型
eg:
- map <string,int> mp;字符串到整形的映射
必须使用string不能用char数组 - map<set<int>,string> mp;set容器映射到字符串
map容器内元素的访问:
- 通过下标访问
map<char,int> mp;
mp['c'] = 30;
printf("%d",mp['c']);
输出为30。
- 通过迭代器访问 map的迭代器的定义与使用与其他容器不同
定义:map<typename1,typename2>::iterator it
it同时访问键和值。通过it->first访问键,it->second访问值。
map<char,int> mp;
mp['c'] = 30;
mp['a'] = 10;
mp['d'] = 40;
for(map<char,int>::iterator it = mp.begin();it!=mp.end();it++)
{
printf("%c %d\n",it->first,it->second);
}
map根据键从小到大排序。
常用函数:
- find(key) O(logN)
- erase()
- 删除单个元素
(1) mp.erase(it) it为需要删除的元素的迭代器O(1)
(2) mp.erase(key) key为欲删除的键 O(logN) - 删除一个区间的所有元素
mp.erase(first,last) **O(last - first)**first为起始迭代器,last为末尾迭代器的下一个地址
- size() O(1)
获取map中映射的对数。 - clear() O(N)
清空map中的所有元素
queue
定义:队列,先进先出
queue<typename> name;
queue内元素的访问:
queue<int> q;
- q.front()访问队首元素
- q.back()访问队尾元素
常用函数:
- push() O(1)
push(x)将x入队 - front(),back() O(1)
访问队首,队尾元素。 - pop() O(1)
令队首元素出队 - empty() O(1)
检测队列是否为空,反回ture为空,false为非空 - size() O(1)
返回队列内个数
使用front(),pop()前必须用empty()判断是否为空
priority_queue
定义:优先队列,队首元素为优先级最高元素
头文件:#include
priority_queue<typename> name;
优先队列中元素的访问:
只能透过top()函数来访问。
常用函数:
- push() O(logN)
push(x)将x入队。 - top() O(1)
获得队首元素。 - pop() O(logN)
队首元素出队。 - empty() O(1)
检测队列是否为空,反回ture为空,false为非空 - size() O(1)
返回队列内个数
优先级的设置
(1)基本数据类型的优先级设置
两种优先队列设置
priority_queue\<int> q;
priority_queue\<int,vector\<int>,less\<int> > q;
- 参数vector<int>用于承载底层数据结构堆的容器,类型与第一个参数的类型相同。
- less<int>表示数字大的优先级越大。
- 换成greater<int>表示数字小的优先级越大。
(2) 结构体的优先级设置
stack
定义:栈,后进先出
头文件:#include<stack>
stack<typename> name;
stack 容器内元素的访问:
只能通过top()访问栈顶元素
常用函数
- push() O(1)
push(x)将x入栈。 - top() O(1)
获得栈顶元素。 - pop() O(1)
栈顶元素出栈。 - empty() O(1)
检测栈是否为空,反回ture为空,false为非空 - size() O(1)
返回队列内个数
pair
定义:用于将两个元素绑在一起作为一个合成元素。
头文件:include<utility>
pair<string,int> p;
定义时初始化:pair<string,int> p("haha",5);
代码中临时构建pair:
pair<string,int>("haha",5)
make_pair("haha",5)
p中的两个元素通过p.first,p.second访问。比较时先比较first,相等则比较second。
algorithm头文件下的常用函数
1.max(),min(),abs()
- max(x,y)
返回最大值 - min(x,y)
返回最小值 - abs(x)
x为整数,返回x的绝对值。若为浮点型用math头文件下的fabs()
2.swap()
- swap(x,y)交换x,y的值
3.reverse()
- reverse(it,it2)将数组或者迭代器在(it,it2]范围内的元素反转。
4.next_permutation()
- 给出一个序列在全排列中的下一个序列
int a[10] = {1,2,3};
do
{
printf("%d%d%d\n",a[0],a[1],a[2]);
}while(next_permutation(a,a+3));
5.fill()
这里赋值与memset不同可以是范围内的任意值。
int a[5];
fill(a,a+5,100);
6.sort()
用于排序
7.lower_bound(),upper_bound()
- lower_bound()
寻找数组或容器中第一个值大于等于元素的位置 - upper_bound()
寻找数组或容器中第一个值大于元素的位置