语法知识
[TOC]
结构体重载运算符
struct people
{
string name;
int age;
bool operator > (const people x) const
{
return this-> age>x.age;
}
};
priority_queue <people,vector<people>,greater<people> >q;
string
//string转数字:
int num = stoi(s);
long num = stol(s);
long long num = stoll(s);
double num = stod(s);
//数字转string:
string num = to_string(num) ;
for(auto c : to_string(x)) {...}//先变为字符串再提取每一位
String s(int n,char c);创建一个String,由n个c组成
getline(cin,s);读入s,空格也同样会读入,直到回车才会停止
int num = count(temp.begin(),temp.end(),'a');字符串找固定字符的数量
s.substr(p,n)返回从s的下标p开始的n个字符组成的字符串,如果n省略就取到底O(n)
s.length()返回字符串的长度O(1)
s.empty()判断s是否为空,空返回1,不空返回0,O(1)
s.erase(p0,len)删除s中从p0开始的len个字符,如果len省略就删到底O(n)
s.erase(s.begin()+i)删除下标为i个字符O(n)
s1.insert(p0,s2,pos,len)后两个参数截取s2,可以省略O(n)
s.insert(p0,n,c)在p0处插入n个字符c O(n)
s1.replace(p0,len0,s2,pos,len)删除p0开始的len0个字符,然后在p0处插入串s2中从pos开始的len个字符,后两个参数可以省略O(n)
s1.find(s2,pos)从前往后,查找成功时返回第一次出现的下标,失败返回string::npos的值(-1)O(n*m)
s1.rfind(s2,pos)从pos开始从后向前查找字符串s2中字符串在当前串后边第一次出现的下标O(n*m)
顺序相关
- 有序序列的二分
int a[100],p;
//数组a要从小到大排序
lower_bound(a,a+100,p)-a;
//返回的是在数组a中“大于或等于”p这个数的地址。不存在则返回100(队尾)。
upper_bound(a,a+100,p)-a;
//返回的是在数组a中“大于”p这个数的地址。不存在则返回100(队尾)。
//数组a要从大到小排序
lower_bound(a,a+100,p,greater<int>())-a;
//返回的是在数组a中“小于或等于”这个数的地址。不存在则返回100(队尾)。
upper_bound(a,a+100,p,greater<int>())-a;
//返回的是在数组a中“小于”这个数的地址。不存在则返回100(队尾)。
2.全排列
next_permutation(start,end)prev_permutation(start,end)
3.第k小数
复杂度O(n)
nth_element(a+1,a+k,a+n+1)//默认的升序
nth_element(a+1,a+k,a+n+1,cmp)//自定义比较方式
//cout<<a[k]即可
//nth_element 并没有对数组全部排序 仅仅只是找到了第k小的数并将其放到第k个位置上。
//k之前的都比k小,k之后的都比k大,但是并不是有序排列
bitset
bitset<8> b2(12); //二进制长度8,将12转化为二进制存到其中。
cout << b2 << endl;
string s = "10010";
bitset<8> b3(s);
cout << b3 << endl;//存字符串/字符数组
bitset<8> bs(13);
cout << bs <<endl; //00001101
for(int i=0;i<7;i++) cout<<bs[i]; //10110000
//像数字一样的操作
b2 |= b3;
b2 &= b3;
b2 ^= b3;
b2 = ~b2;
b2 <<= 2;
//自带函数
int cnt_1 = b2.count(); //查询二进制数组中,1的个数;
int len = b2.size(); //二进制数组的长度,就是定义的长度;
int test = b2.test(7); //判断第x个位置是0还是1,也就是输出第x个位置,注意逆序;
b2.flip(); //将二进制每一位取反;
b2.flip(3); //将二进制第x位取反;
b2.set(); //将二进制每一位置为1; reset置为0;
b2.set(3); //将第x个位置置为1;
string ss = b2.to_string(); //将二进制数组转化为字符串。
其他
去重
memcpy(backup, g, sizeof g);//数组拷贝
int n = unique(a,a+6)-a;//将重复的数字放在了最后面
矩阵与一个整数的映射
123 456 789
//当a=N*(i-1)+y时,即xy都是1~n
void get(int a, int &x,int &y){
y=a%n;
if(y==0)y=n;
x=(a-y)/n+1;
}