《算法笔记》 第六章 C++标准模板库(STL)介绍

一、vector

注意点:
v.begin()+2可以看作v[2]
常用函数:
push_back()
pop_back()
size()
clear()
insert(iterator it,x)//在迭代器it处插入一个元素x
erase(iterator it)//删除it位置的元素
erase(v.begin+1,v.begin+4)//删除v[1],v[2],v[3](左闭右开)

二、set/multiset

注意点:
内部自动有序且不含重复元素
可以重载排列规则
常用函数:
insert()
find(x)//返回set容器内值为x所对应的迭代器
erase(iterator it)//删除it位置的元素
erase(iterator first,iterator last)//删除[first,last)范围内的元素
size()
clear()

三、string

注意点:
可以使用+=符号,将两个字符串拼接起来
可以使用比较运算符,比较规则是字典序
常用函数:
length()
insert(int pos,string str)
insert(str.begin()+3,str2.begin(),str2.end())
substr(pos,len)返回从pos位置长度为len的子串
例:substr(0,5)从第0号下标开始长度为5的子串
string::npos用以作为find函数失配时的返回值,等于-1或4294967295

if(str.find('A')!=string::npos)
{
	cout<<"A存在于字符串str中"<<endl;
}

str.find(str2,pos)从pos开始查找(不输入时默认从头开始查找),若str2是str的子串时,返回其在str中第一次出现的位置,若不存在则返回string::npos
replace(10,4,str2)//从10号位置开始,长度为4的子串替换成str2
replace(str.begin(),str.begin()+5,str3)从[0,5)范围的子串替换成str3

四、map

注意点:
map会以键从小到大的顺序自动排序
map的赋值可以写成:m[key]=value;
map底层为红黑树
map的键值都是唯一的,如果一个键要对应多个值就只能用multimap

map<char,int> mp;
mp['A']=15;

常用函数:
find(key)//返回键为key所对应的迭代器
erase(iterator it)//删除it位置的元素
erase(key)//删除键为key所对应的键值对
erase(iterator first,iterator last)//删除[first,last)范围内的元素
size()
clear()

五、queue

注意点:
只能通过front()和back()来访问队列中的元素
还存在双端队列deque
实现广度优先搜索时可以利用该队列
常用函数:
push()
front() back()
pop()//令队首元素出队
empty()
size()

六、priority_queue

注意点:
底层为堆实现
头文件为#include
只能通过top()来获取优先级最高的元素
可以重写排列规则
可以解决一些贪心问题,也可以对迪杰斯特拉算法进行优化
常用函数:
push()
top()
pop()
empty()
size()
元素优先级设置
①基本数据类型的优先级设置

priority_queue<int,vector<int>,greater<int>>q//将最小元素放队首
priority_queue<int,vector<int>,less<int>>q//将最大元素放队首

②结构体的优先级设置
方法一:重载函数写在结构体内部
注意这里的重载与sort中的cmp效果是相反的,作用是类似的

struct fruit{
	string name;
	int price;
	friend bool operator<(const fruit &f1,const fruit &f2)
	{
		return f1.price<f2.price;//规定价格高的优先
	}
};
priority_queue<fruit> q;

方法二:把重载函数写在结构体外部

struct cmp{
	bool operator () (const fruit &f1,const fruit &f2){
		return f1.price>f2.price;
	}
};
priority_queue<fruit,vector<fruit>,cmp> q;

七、stack

注意点:
只能通过top()访问栈顶元素
用来模拟递归
常用函数:
push()
top()
pop()
empty()
size()

八、pair

注意点:
头文件#include
初始化

pair<string,int> p1("haha",10);
pair<string,int> p2=make_pair("hoho",20);

访问时采用p.first和p.second来访问
可以作为map的键值对进行插入
常用函数:
比较,直接使用==,!=,<=等比较大小,比较规则为先以first的大小为标准,只有当first相等时才去判别second的大小

九、algorithm头文件下的常用函数

max(x,y)
找三个最大值的时候可以使用max(x,max(y,z))
min(x,y)
abs(x)
这里的x必须是整数,如果x是浮点型,就用math头文件下的fabs
swap(x,y)
用来交换x,y的值
reverse()
这里也可以改变左右限制,只对部分进行反转

int a[5]={10,11,12,13,14};
reverse(a,a+5);//将整个数组反转
string str="jiohbdhsjamkc";
reverse(str.begin(),str.begin()+str.length());//将str反转

next_permutation()//全排列

int a[3]={1,2,3};
do{
	printf("%d%d%d\n",a[0],a[1],a[2]);
}while(next_permutation(a,a+3));

fill()
把数组或容器中的某一段区间赋为某个相同的值

int a[5]={1,2,3,4,5};
fill(a,a+5,233);//将a[0]~a[4]均赋值为233

sort()
sort(首元素地址,尾元素地址的下一个地址,比较函数(非必填))
如何实现比较函数cmp(下面以int为例)

bool cmp(int a,int b)
{
	return a>b;
}
sort(a,a+5,cmp);//实现从大到小排序

在sort函数这里,无论是基本数据类型还是结构体数据类型均可以把cmp函数写在外面,按照题目要求写即可
lower_bound(first,last,val)
在[first,last)范围内第一个值大于等于val的元素位置
upper_bound(first,last,val)
在[first,last)范围内第一个值大于val的元素位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值