摘自《算法笔记》
1 vector
长度根据需要自动改变的数组
case: |
---|
1. 用普通数组会超内存时 2. 以邻接表的方式储存图 |
使用方法
添加vector头文件
#include<vector>
using namespace std;
定义
vector<typename> name;
typename可以是
-
基本类型
int,double,char,结构体
vector<int> name; vector<node> node;//node为结构体
-
STL标准容器
vector,set,queue
在两个
>
之间加上空格,形如> >
vector<vector<int> > name;//>>之间要加空格
vector<typename> Arrayname[arraySize];
下标0~arraySize-1 每一个都是一个vector容器
访问
-
下标访问
直接
vi[index]
-
迭代器访问
vector<typename>::iterator it;
it是一个
vector<typename>::iterator
型变量,可通过*it
访问vector里的元素
相关函数
vi.function()
begin()
:取vi的首元素地址
end()
:取尾元素地址的下一个地址
迭代器不支持it < vi.end()
写法,因此循环条件只能用it != vi.end()
push_back(x)
:在vector后面添加一个元素x
pop_back()
:删除vector的尾元素
size()
:获得vector中元素个数,返回的是unsigned类型
clear()
:清空vector中的所有元素
insert(it,x)
:向vector的任意迭代器it处插入一个元素x
erase()
:删除单个元素vi.erase(it)
、删除一个**区间[first,last)**内的所有元素vi.erase(first,last)
常见用途
- 储存数据
- 使用邻接表存储图
2 set
内部自动有序且不含重复元素的容器
case |
---|
1.需要去掉重复元素时 2.元素比较大或类型不是int型而不能直接开散列表时,使用set保留元素本身而不考虑个数 |
使用方法
添加set头文件
#include<set>
using namespace std;
定义
set<typename> name;
typename可以是任意类型【写法同vector基本一样】
访问
只能通过迭代器
set<tyoename>::iterator it;
**除开vector和string之外的STL容器都不支持*(it+i)
**的访问方式
只能使用
for(set<int>::iterator it = st.begin();it != st.end(); it++)
来枚举。
set内元素自动递增排序,且自动去除了重复元素
相关函数
insert(x)
:将x插入set容器中,自动递增排序和去重,时间复杂度
o
(
log
N
)
o(\log N)
o(logN)
find(value)
:返回set中对应值为value的迭代器,时间复杂度
o
(
log
N
)
o(\log N)
o(logN)
erase()
:两种用法:删除单个元素、删除一个区间内的所有元素
-
删除单个元素
st.erase(it)
, o ( 1 ) o(1) o(1)st.erase(value)
, o ( log N ) o(\log N) o(logN)
-
删除一个区间内所有元素
st.erase(first,last)
size()
:获得set内元素的个数
clear()
:清空set中的所有元素
常见用途
自动去重并按升序排序
3 string
使用方法
添加string头文件
#include<string>
using namespace std;
定义
string str;
访问
-
下标访问
str[i]
读入和输出整个字符串,只能用
cin
和cout
-
通过迭代器访问
string::iterator it;
string和vector一样,支持直接对迭代器进行加减某个数字
相关函数
operator +=
:将两个string直接拼接起来
两个string类型可以直接使用==, !=, <, <=, >, >=
比较大小,比较规则是字典序
length()/size()
:返回string的长度
insert()
insert(pos,string)
:在pos号位置插入字符串stringinsert(it,it2,it3)
:it为原字符串的欲插入位置,it2和it3为待插字符串的首尾迭代器,[it2,it3)将被插在it位置上
erase()
:删除单个元素,删除一个区间内所有元素
- 删除单个:
str.erase(it)
- 删除所有:
str.erase(first,last)
str.erase(pos,length)
clear()
:清空所有
substr(pos,len)
:返回从pos位开始,长度为len的子串
string::npos
:一个常数,本身值为-1,也可认为是unsigned_int类型的最大值,用以作为find函数失配时的返回值
find()
str.find(str2)
:当str2时str的子串时,返回其在str中第一次出现的位置;如果str2不是str的子串,返回string::nposstr.find(str2,pos)
:从str的pos位开始匹配str2,返回值与上相同
replace()
str.replace(pos,len,str2)
:把str从pos号位开始、长度为len的子串替换为str2str.replace(it1,it2,str2)
:把str的迭代器[it1,it2)范围的子串替换为str2
4 map
数组将int型映射到其他类型
map可以将任何基本类型(包括stl容器)映射到任何基本类型(包括stl容器)
使用方法
map<typename1,typename2>mp;
typename1:键的类型
typename2:值的类型
访问
-
通过下标访问,map中的键是唯一的
-
通过迭代器访问
map<typename1,typename2>::iterator it;
it->first
访问键,it->second
访问值map会以键从小到大的顺序自动排序
相关函数
find(key)
:返回键为key的迭代器
erase()
-
删除单个元素
mp.erase(it)
mp.erase(key)
-
删除一个区间内的所有元素
erase(firsr,last)
size()
:获得map中映射的对数
clear()
:清空map中的所有元素
常见用途
- 简历字符或字符串之间映射的题目
- 判断大整数或者其他类型数据是否存在的题,可以把map当bool数组用
- 字符串和字符串的映射也可能会遇到
5 queue
使用方法
添加头文件queue
#include<queue>
using namespace std;
定义
queue<typename> name;
访问
front()
访问队首元素
back()
访问队尾元素
相关函数
push()
:入队
pop()
:出队
empty()
:检查queue是否为空,true则空
size()
:返回queue内元素个数
常见用途
- 广度优先搜索
6 priority_queue
优先队列,底层用堆来实现,队首元素一定是当前队列中优先级最高的那一个
可以在任意时候往优先队列里面加入push元素,优先队列底层的数据结构堆heap会随时调整结构,使得每次的队首元素都是优先级最大的
使用方法
添加头文件queue
#include<queue>
using namespace std;
定义
priority_queue<typename> name;
访问
只能通过top()
函数来访问队首元素
相关函数
push()
top()
:获得队首元素
pop()
:队首元素出队
empty()
size()
优先级设置
-
基本数据类型:一般是数字大的优先级越高
priority_queue<int> q; priority_queue<int,vector<int>,less<int>> q;
vector是承载底层数据结构堆的容器
less是对第一个参数的比较类,表示数字大的优先级越大,greater表示数字小的优先级越大
-
结构体
重载比较符号
常见用途
- 贪心问题
- Dijkstra算法优化
使用top函数前,必须用empty判断优先队列是否为空
7 stack
使用方法
添加头文件stack
#include<stack>
using namespace std;
定义
stack<typename> name;
访问
top()
常用函数
push()
top()
pop()
empty()
size()
常见用途
实现递归
8 pair
将两个元素绑在一起作为一个合成元素、又不需要定义结构体,可以看成一个内部有两个元素的结构体
使用方法
#include<utility>
or
#include<map>
using namespace std;
定义
pair<typeName1,typeName2> name;
//定义时初始化
pair<string,int>p("haha",5);
//临时构建一个pair
pair<string,int>("haha",5)
make_pair("haha",5)
访问
按正常结构体的方法去访问
相关函数
可以直接使用==, !=, <, <=, >, >=
比较大小,比较规则时先以first大小作为标准,当first相等时判别second的大小
常见用途
- 代替二元结构体及其构造函数,可以节省编码时间
- 作为map的键值对来进行插入
9 algorithm头文件下的常用函数
#include<algorithm>
using namespace std;
max(),min(),abs()
2个数最值:max(x,y)
3个数最值:min(a,min(b,c))
整数绝对值:abs(x)
浮点型:fabs(x),math头文件
swap()
交换两个值
reverse()
reverse(it,it2)
将数组指针在[it,it2)之间的元素进行反转
next_permutation()
一个序列在全排列中的下一个序列
fill()
把数组或容器中某一段区间赋为某个相同的值,数组类型对应范围中的任意值
fill(it,it2)
sort()
sort(首元素地址必填,尾元素地址的下一个地址必填,比较函数非必填)
不填比较函数,默认对前面给出的区间进行递增排序
cmp()
bool cmp(typename1,typename2){}
...
sort(type1,type2,cmp);
lower_bound(),upper_bound()
需要用在一个有序数组或容器中
lower_bound(first,last,val)
:[first,last)中第一个值大于等于val的元素的位置(指针或迭代器)
upper_bound(first,last,val)
:[first,last)中第一个值大于val的元素的位置(指针或迭代器)
如果没有需要寻找到元素,则返回的是可以插入该元素的位置或迭代器