语法知识等

语法知识

[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,由nc组成
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的值(-1O(n*m)

s1.rfind(s2pos)pos开始从后向前查找字符串s2中字符串在当前串后边第一次出现的下标O(n*m)

顺序相关

  1. 有序序列的二分
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;
}