OI中的C++语法基础&进阶技巧
前言: 写这个的目的主要是为了总结在OI中用到的C++语法奇淫巧技以及在入门的时候没学好的C/C++语言语法部分
数据类型
OI中常用的数据类型大小
数据类型 | 范围 | 位数 |
---|---|---|
int | -2147483648~2147483647 | 10 |
unsigned int | 0~4294967295 | 10 |
long long | -9223372036854775808~92233,72036,85477,5807 | 19 |
unsigned long long | 0~18446744073709551615 | 20 |
总之,9位数能安全地用int存下,18位数用long long,19位数或是 2 64 2^{64} 264以内用unsigned long long.
另外,合理利用unsigned类型的自动溢出机制可以实现取模运算中的骚操作–快速乘.
输入输出相关(printf,cout)
关于printf菜鸟教程已经讲得很详细了,下面给出几个实例:
#include <bits/stdc++.h>
using namespace std;
int main()
{
printf("%-6d\n",3);
printf("%+06d\n",3);
printf("%010.2f\n",32434.434);
unsigned long long a=1;
for(int i=1;i<=64;i++) a*=2; a--;
printf("%llu",a);
return 0;
}
输出:
3
+00003
0032434.43
18446744073709551615
结构体(struct)
结构体以前比较常用的是带结构体排序,就不再提及.高阶技巧便是把结构体当作一个简单版class用,可以封装一些函数,结构体中的运算符重载也能节约不少时间.
初始化
struct test
{
int a,b,c;
test(int p,int q)
{
a=p,b=q;
}
test(char s)
{
c=s-'A';
}
};
int main()
{
test a=test(3,5);
test b(3,5);
test c('A');
cout<<a.a<<' '<<b.b<<' '<<c.c;
return 0;
}
输出:
3 5 0
简单来讲就是让新建一个结构体变量的操作变方便了
运算符重载
别看代码短,其实有很多东西
struct test
{
int a,b,c;
test(int p,int q)
{
a=p,b=q;
}
/*
下面这个函数的返回值为bool,重载的运算符为<,运算符左边的数据类型为test,右边
的数据类型也为test
括号内const和&的用途在于加速和不改变源值
第二个const放在非静态成员函数的尾部,表示该非静态成员函数不修改对象内容
*/
bool operator < (const test &m) const
{
if(a<m.a) return false;
else return true;
}
bool operator > (const test &m) const
{
if(b>m.b) return true;
else return false;
}
int operator + (const test &m) const
{
return a+b+m.a+m.b;
}
test operator - (const test &m) const
{
test q(a-m.a,b-m.b);
return q;
}
};
int main()
{
test a=test(3,5);
test b(2,6);
test c(3,7);
cout<<(a<b)<<' '<<(a>b)<<' '<<(a+b)<<' '<<(b-c+a);
return 0;
}
输出:
1 0 16 6
面向对象编程
参看菜鸟教程