重点注意
不要在main
函数里创建数组
哈希表
有序哈希表map
(按照键大小排序),无序哈希表unordered_map
if(ump.count(x)==0){
ump[x]=1;
}
二维坐标转一维坐标
将(0,0)开始的二维坐标映射为从0开始的一维坐标
int get(int x,int y){
//n为列数
return x*n+y;
}
如果二维坐标是从(1,1)开始的话,要先减减,再输入get函数
int a=2,b=1;
a--,b--;
get(a,b);
上下左右的坐标
get(a+1,b);
get(a-1,b);
get(a,b+1);
get(a,b-1);
离散化
将大数字转化为一个从1开始的小数字
注意转换过程中,并保证数字大小的顺序保持不变
ump.clear();//清空哈希表,常在多组数据中使用
int idx=0;//离散化从1开始
unordered_map<int,int>ump;
int s(int x){
if(ump[x]==0) ump[x]=++idx;
else return ump[x];
}
int main(){
a=s(a);
}
吸收换行符号
一般在要getline前使用
char c;
getchar();
读入一行,并把一行每个分开的元素分别读入到不同的位置
E: 123 song fdu
char c=getchar();
while(m--){
string line;
getline(cin,line);
stringstream ss(line);//将line的内容写入ss中
int x;
while(ss>>x){//将ss写入x中,按空格分别写入,注意要放在while循环中
cout<<x<<" ";
}
cout<<endl;
}
结构体的简便读与写
struct edge{
int a,b,w;
}e[N];
//写,要加引用
for(int i=0;i<k;i++){
auto &[a,b,w]=e[i];
//要修改值就要用引用
cin>>a>>b>>w;
}
//读,可以不加引用
for(int i=0;i<k;i++){
auto [a,b,w]=e[i];
//要修改值就要用引用
cout<<a<<" "<<b<<" "<<w<<endl;
}