万能头文件
#include<bits/stdc++.h>
遍历容器
带&:取地址,及取出来的是原元素。
不带&:引用,及取出来的是副本,不会对原元素造成影响。
for (auto &ele : st) //auto为类型 st为容器名cout << ele << endl;
迭代器find()
一般容器,如vector、map等
s.find(x) == s.end()//没找到
if (s.find(x) != s.end())//如果找到了
string字符串
if(B.find(ch)==string::npos)
//find()未查询到的返回值是string::npos,此代码表示未查询到
数字字符转化为整形
ans=ans*10+ch-'0';//数字字符减去0的ASCII码后转化为整形//ans*10防止输入二位以上数
阶乘函数
tgamma(n+1)指的是1到n的阶乘,及n!
以下函数返回的是C(p,l),及为从 p个不同元素中取 i 个元素的组合数。
double just(int p,int l){return tgamma(p + 1) / (tgamma(l + 1) * tgamma(p - l + 1));
}
要注意 tgamma的返回值为double。不过可以传入int再用double进行接收
cout << fixed << setprecision(0) << sum;
如果要输出整数,可以结合以上代码去掉浮点类型小数部分
如果求C(n,m)可以用tgamma但是单纯求阶乘累加我推荐下面这种 (L1-013 计算阶乘和)
for(int i=1;i<=n;i++)
{add*=i;sum+=add;
}
判断素数/质数
bool is_prime(int x)
{if (x < 2) return false;for (int i = 2; i <= x / i; i ++ )if (x % i == 0)return false;return true;
}
setw()字段宽度函数运用
setw(int n)是c++中在输出操作中使用的字段宽度设置,设置输出的域宽,n表示字段宽度。只对紧接着的输出有效,紧接着的输出结束后又变回默认的域宽。
当后面紧跟着的输出字段长度小于n的时候,在该字段前面用空格补齐;当输出字段长度大于n时,全部整体输出。
cout << setw(5)<< i;//设置i的字段宽度为5,不足用空格补齐,在i前添加,i为最后一个字段
dev-cpp开启c++11
ps:在我使用dev-c++时报错:
range-based ‘for’ loops are not allowed in C++98 mode
解决方法1:工具—>编译选项—>程序
gcc:gcc.exe -std=c++11
g++:g++.exe -std=c++11
解决方法2:工具—>编译选项—>编译器
勾选编译时加入以下命令:
添加: -std=c++11
ps:注意-std前有一个空格。
double类型保留几位小数
括号中的数表示保留几位小数,需要注意的是,此函数是有四舍五入功能的。
所以setprecision(0)通常用于小数部分为0的数取整,及配合tgamma函数使用。
cout<<fixed<<setprecision(2)<<n;
IO优化c++
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); 的作用和注意事项-CSDN博客
重点注意:cout<<endl不能使用,要用cout<<‘\n’
ios::sync_with_stdio, cin.tie(0), cout.tie(0);
初始化数组/容器
memset只能设置0,-1或很大/很小的数(但是memset很快),所以改用stl自带函数fill()
数组
fill(dp, dp + N, 1); // 正确初始化dp数组为1
容器
fill(v.begin(), v.end(), 1);
清空元素释放内存
数组
memset(a,0,sizeof a);
memset(diff,0,(t+1)*4);
a是数组名,0是初始化值,(t+1)*4是字节数,int是4字节,long long是8字节
容器
为什么不用自带的clear()?因为clear()只能清空元素不能释放内存。
vector<string> v;
map<string,int> m;
vector<string>().swap(v);
map<string,int>().swap(m);
getline()
固定搭配,cin输入后需要吃掉回车再用getline输入
cin >> n;
cin.ignore(); // 吃掉回车
getline(cin, s);
异或运算符: a^b
#include<bits/stdc++.h>
using namespace std;
const int N =1e5+10;
int a[N];
int main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int n,res=0;cin>>n;for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<n;i++){for(int j=0;j<=i;j++){res=max(res,a[i]^a[j]);}}cout<<res;return 0;
}
最大公约数
__gcd(a,b);
最小公倍数
__lcm(a,b);
大数模除法
#include<bits/stdc++.h>
using namespace std;
const int N =1e6;
int main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int ans=0;string s="12345678901234567890123456789012345678901234567890";for(char ele : s){ans=(ans*10+(ele-'0'))%2023;}cout<<ans;return 0;
}
字符串转数字、数字转字符串、字符转字符串
字符串转数字
int num=stoi(s3);
数字转字符串
string s1=to_string(a);
字符转字符串
string(1,ele);
反转字符串
reverse(s2.begin(),s2.end());
double型保留精度(非输出)
double tr(double value, int pre) {double factor = pow(10.0, pre);return trunc(value * factor) / factor;
}
double tr = tr(value, 6);//保留6位精度
更加简洁的是用round函数(带四舍五入)
round(i * 100) / 100
输入不定长数据
do{int n;cin>>n;v.push_back(n);}while(cin.get()!='\n');
将字符串转化为小写
transform(s.begin(),s.end(),s.begin(),::toupper);