一、string的函数
- substr(起始位置,截取长度)
- find方法,返回子字符串起始位置
- replace(子串起始位置,子串长度,替换内容),替换内容长度可以和子串长度不一致

练习题目:蓝桥250

要注意的是有空格,所以读取要注意
cpp
getline(cins,s1);
二、sort用法
sort(起始地址,结束地址下一位,*比较函数), * 代表可选,范围左闭右开
比较函数
cpp
bool cmp(const int &u,const int &v) //也可以直接写 int u,int v
{
return u > v;
//返回序列为 : a>b>c
}
int main()
{
vector<int> v = {1,2,3,4,5,8,6,7};
sort(v.begin(),v.end(),cmp);
return 0;
}
//当a相等时比较b
//1.结构体内定义
struct Node{
int u,v;
bool operator < (const Node &m) const
{
return u==m.u ? v<m.v : u < m.u;
}
};
//2. 单独的比较函数
struct Node{
int a;
int b;
};
bool cmp(int u,int v){
if(u.a==v.a)
return u.b < v.b;
else
return u.a < v.a;
}
三、最值查找
cpp
//min max
min(3,5)
min({1,2,3,4,5})
//min_element,max_element,返回最值的地址
min_element(v.begin(),v.end())
cout<< *min(v.begin(),v.end()) <<endl;
//nth_element(start,k,end)
//进行部分排序,第k个位置以前均比这个位置的数小,后的都比它大,但是只有第k个位置是一定正确的,其他位置上的数字可能是错误的
//可以原来寻找第几大的数字
vector<int> v = {5,3,2,1,6,7,8,0}
nth_element(v.begin(),v.begin()+3,v.end()) //v[3]处于正确位置
for(int i=0;i<n;i++)
cout<<v[i]<<' ';
//结果:3,1,5,7,9,18,10 7一定是正确位置
四、二分法
适用有序列表
整数二分

cpp
//计算升序数组中,x第一次出现的位置
int l=0;
int r=1e9;
//终止条件,lr相邻
while(l+1!=r){
int mid = (l+r)/2;
if(a[mid]>=x) r=mid;
else l=mid;
}
cout<<r<<endl;
浮点二分
实数范围内
cpp
double l=0,r=1e9,eps=1e-6;
while(r-l>=eps)
{
double mid = (l+r)/2;
double mid = (l+r)/2;
if(f(mid)>=0) r=mid;
else l=mid;
}
二分答案
cpp
bool check(int mid){
bool res = true;
return res;
}
int main(){
int l=0,r=1e9;
while(l+1 != r){
int mid = (l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
cout<< l << '\n';
}
五、大小写字母
1、islower isupper
返回bool型
2、tolower toupper
tolower/toupper:如果不是大写字母则不进行操作
3、ASCII码

cpp
//字符'6'->6
int a = '6'-'0';
//a->A
char ch = 'a';
ch = 'a'-32;
六、全排列
1、next_permutation()
这个函数用于生成当前序列的下一个排列,按照字典序对序列进行重新排列,如果存在下一个排列,将当前序列更改为下一个排列,并返回true,如果已经是最后一个了,返回false
cpp
vector<int> nums = {1,2,3}
for(int num:nums)
cout<<num<<' ';
cout<<endl;
while(next_permutation(nums.begin(),nums.end())){
for(int num:nums)
cout<<num<<' ';
cout<<endl;
}
2、prev_permutation()
和next_permutation()函数相反,用于生成上一个排列。
cpp
vector<int> nums = {3,2,1};
for(int num:nums)
cout<<num<<' ';
cout<<endl;
while(prev_permutation(nums.begin(),nums.end())){
for(int num:nums)
cout<<num<<' ';
cout<<endl;
}
七、其他库函数
1、memset(ptr,value,num)
ptr:开始地址
value:要设置的值,二进制数,除了0和-1,其他赋值都不等于value
num:要设置的字节数
cpp
memset(arr,0,sizeof(arr));
2、swap
cpp
int a=3;
int b=4;
swap(a,b);
cout<<a<<' '<<b; //4 3
3、reverse(begin,end)
范围左闭右开
4、unique(begin,end)
范围左闭右开,unique函数将相邻的重复元素去除,并返回一个指向去重后范围的尾后迭代器。去重后的范围只保留了第一个出现的元素,后续重复的元素都被移除
cpp
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[10]={1,1,2,3,4,3,4,2,4,5};
int n = unique(a,a+10) -a;
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
}
//1 2 3 4 3 4 2 4 5
八、数据类型
1、pair

默认排序是先first字典序,后second字典序
2、vector
- pop_back、push_back
- 指定位置插入:insert(place,value),指定位置删除:erase(begin,end)

3、stack

4、queue

5、priority_queue
和普通队列相比,元素按照一定的优先级排序,默认情况下,按照元素从大到小排序

修改比较函数的方法
cpp
struct Compare{
bool operate() (int a,int b){
return a>b;
}
};
int main(){
priority_queue<int,vector<int>,Compare>pq;
priority_queue<int,vector<int>,greater>pq; //小根堆,最小的是top
}
6、deque双端队列

7、set

