比较重要:
1. 位运算符:
<1>&(按位与):当两个数的二进制位同为1的时候,结果位才为1.否则为0.(简记:and同一为一,不同一为0.)
<2>|(按位或):当两个数的二进制有一个为1的时候,结果位为1.否则为0.(简记:or只有有一就是一).
<3>^(按位异或):当两个数二进制位数不相同时,结果位才为1.否则为0.(简记:xor不同才是1相同才为0).
<4>~(取反):二进制的位相反,当为1时为0,为0时为1.(简记:1为0,0为1)。
<5>”<<”(左移):把左面移动几位,右面用0补上几位。EX:<<4为向左移4位.(相当于称2,速度快)。
<6>”>>”(右移):跟<5>相反相当于除2.
2. 变量范围
3. ASCII表
4. 转义字符
5. 强制转换
老式: (类型名)(表达式);
新式: static_case<类型名>(表达式);
不同:反正两个差不多,老式出错率大了点而已。比赛推荐老式。新式写起来费时间。
6.输入输出
说实话我写这个是完全为了学点c的,熟悉一下。毕竟scanf比cin流输入快。还有另外一种比较开挂的读入。代码如下:
<1>cin>>变量;
cout<<变量<<endl;
<2>scanf(“%d %d”,&a,&b);
输入a,b值。
scanf(“%4d”,&a);
输入a的值的位数是输入的前4个。
scanf(“%s”,st);
输入st字符串,遇到空格结束。
scanf(“%*d”,a);
输入的不给变量a;
scanf(“%d,%d,%d”&a,&b,&c);
输入abc的时候要输入逗号。
d, i u 用于int类型、无符号输入(u)
ld 用于long int 输入
hd 用于 short 输入
f,e 用于输入实数
s 用于输入字符串
c 用于输入字符串
x o 分别是十六进制,八进制输入
<3>printf(没有&地址符)
printf(“%d”,a);
d,i(u) 用于int(无符号)输出
x,o 用于十六进制、八进制输出
c,s 用于单字符、字符串输出
f 用于小数输出单双精度浮点数
ld 用于longlong类型输出
e 用指数输出
g 自动选%f%e中宽度小的输出
%md、%-md、%0md 输出m位、左对齐输出m位、位数不足用0补
(%mld类似啦就是输出longlong类型用法中间加个l好了)
%m.nf、%-m.nf 输出浮点数共有m位(含小数),n位小数,’-’用法和楼上一样
ms 指定m位宽度输出字符串s
m.ns 输出m位字符长度,其中字符最多占n位
(类似也有-ms、-m.ns用法跟楼上的楼上一样啦~)
<4>开挂的读入读写(里面三种读入读写时间cin>scanf>scan())
#include<iostream>
#include<cstdio>
using namespace std;
int scan()
{
long long res = 0, ch, flag = 0;
if((ch = getchar()) == '-')
flag = 1;
else if(ch >= '0' && ch <= '9')
res = ch - '0';
while((ch = getchar()) >= '0' && ch <= '9' )
res = res * 10 + ch - '0';
return flag ? -res : res;
}
int main ()
{
int x,y, z;
x=scan();
cin>>y;
scanf("%d",&z);
cout<<x<<" "<<y<<" ";
printf("%d",z);
return 0;
}
<5>总结:cin流的头文件是<iostream>,它是属于c++范畴的,c++专用。scanf、printf是<cstdio>,c语言的。时间相比看<4>。竞赛用scanf多,反正我平常用cin。没错鄙人就是这么特殊。(其实就是懒,当然竞赛我也会考虑用的)。
6. 文件输入输出
一个特别重要的,因为如果你不会这个,那么你在牛逼,也是0分。重点掌握。
<1>freopen:
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
//add your 代码;
fclose(stdin)
fclose(stdout);
}
平时用cena测评基本都用这种文件输入输出。但是有些比赛不准用重定向。所以介绍下一种。
<2>fstream:
#include<iostream>
#include<fstream>
using namespace std;
int temp;
int main()
{
ifstream fin("xx.in");
ofstream fout("xx.out");
fin>>temp;
fout<<temp<<endl;
fin.close();
fout.close();
}
<3>这两种第一种用起来比较舒服,因为写上这一部分代码,任何输入输出都按正常的写代码。而第二种属于c++的反正写起来比较恶心。如果也是想往常一样写代码。那就用#define fin cin #define fout cout 放在头文件下面几行行了。不过不能用scanf等输入毕竟这个输入c++输入流里面的。
7. 结构体
这个东西可以这么理解,它就是一个虚拟世界的物品。因为一个物品例如正方形,在现实世界中是一个有长度,有宽度,有体积,有面积的物体。而在计算机中如何表示呢,你不可能那个实体塞进去。塞进去就可以上天了。我们就可以把正方形的长宽高体积面积变成数输进去。然后储存在一个东西里。这个东西就叫结构体。代码:
#include<iostream>
using namespace std;
struct data
{
int s; //定义面积
int l; //定义长度
int w; //定义宽度
int h; //定义高度
int v; //定义体积
}cube;
int main()
{
cin>>cube.s>>cube.l>>cube.w>>cube.h>>cube.v;
cout<<cube.s<<" "<<cube.l<<" "<<cube.w<<" "<<cube.h<<" "<<cube.v<<endl;
return 0;
}
调用正方体的数据就类似定义。如果要防止某些数据改变就可以用const 类型名 变量名 ;来定义。如果要多次运用到这个结构体可以用data 变量1,变量2;等方式定义。Struct结构体跟c++类相类似。竞赛用的比较常见。应重点掌握。
8. c++STL函数
一个特别好用的函数库。多掌握几个,写代码跟过家家是的。应该注意,stl函数很耗时间所以谨慎使用。曾经做过洛谷的快排模板的一道题,用sort和自己写快排作对比,快排最慢254ms而sort( )最慢568ms。谁快谁慢自己心理有数好了。不要以为差314ms很少,告诉你有时候你慢1ms,就给你tle。还是能节省就节省。
<1>algorithm
max()、min() 返回两个值中最大、最小值
next_permutation() 把数组进行下一次的全排列
prev_permutation() 把数组进行上一次的全排列
patition() 输入的函数把计算为true的值放在false前面
sort() 从小到大排列一个数组的数
unique() 清除数组里全部重复的数(不是真正的删除,不信可以自己动手写一下)
unique()使用代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[1001],i;
int main()
{ while(cin>>a[i]) i++;
int m=unique(a,a+i)-a;
for(int j=0;j<=m;j++)
cout<<a[j]<<" ";
return 0;}
sort()+自己写的cmp()实现从大到小排列:
#include<iostream>
#include<algorithm>
using namespace std;
int a[1001],i;
int cmp(const int &a,const int &b) {return a>b;}
int main()
{while(cin>>a[i]) i++;
sort(a,a+i,cmp);
for(int j=0;j<i;j++)
cout<<a[j]<<" ";
return 0;}
<2>string
string s1; 定义一个string类型的字符串
string s1(s2); 定义s1内容为s2
string s1(“dingyi”); 定义s1内容为dingyi
string s1(n,’c’); 定义有n个c字符为内容
cin>>s1会忽略字符前的空格等但再次读到空格就会停止,可记为读单词。
getline(cin,s1); 这个输入什么读什么,即读句子。
s3=s1+“add”+s2; s3内容为s1加上add加上s2内容
s1.empty() 如果s1无字符返回true
s1.insert(n,s2) 在下标是n的元素前面插入s2
s1.substr(n,len) 返回一个字符串,包含从下标n开始len个字符
s1.erase(n,len) 删除从下标为n开始len个字符
s1.replace(n,len,s2) 从下标为n开始len个字符用s2代替,如果s2长度大于代替长度,那么后面内容后移它们的差值
s1.find(s2,n) 从下标n开始从前查找s2的出现的第一次位置,没找到返回string::nops
s1.rfind(s2,n) 与楼上类似不过是从后开始查找,返回值也是nops
s1. find_ frist_of (s2,n) 从n下标开始,开始正向查找s2中的某一个字符,如果查到返回第一次出现的值,否则返回sting::nops
s1. find _ last_of (s2,n)与楼上一样。区别为逆向查找
s1. find_ frist_not_of (s2,n)从n下标开始,正向查找s2中的某一字符,只要出现返回string::nops
s1. find_ last_not_of (s2,n)跟楼上一样,逆向查找。
<3>FIFO队列和优先队列
queue<类型名>变量名;
priority_queue<类型名>变量名; 定义优先队列
q.emqty() 如果队列为空返回true否则返回false
q.size() 返回队列个数
q.pop() 删除队首元素,不返回值
q.front() 返回队首值,不删除值
q.back() 返回队尾的值,不删除值
q.top() 优先队列最高优先值
q.push() 在队尾加入一个新元素
<4>vector
vector<类型名>变量名;
v.back() // 传回最后一个数据,不检查这个数据是否存在。
v.begin() // 传回迭代器中的第一个数据地址。
v.capacity() // 返回容器中数据个数。
v.clear() // 移除容器中所有数据。
v.empty() // 判断容器是否为空。
v.end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。
v.erase(pos) // 删除pos位置的数据,传回下一个数据的位置。
v.erase(beg,end) //删除[beg,end)区间的数据,传回下一个数据的位置。
v.front() // 传回第一个数据。
v.pop_back() // 删除最后一个数据。
v.push_back(elem) // 在尾部加入一个数据。
v.resize(num) // 重新指定队列的长度。
v.reserve() // 保留适当的容量。
v.size() // 返回容器中实际数据的个数。
v1.swap(v2) swap(v1,v2) // 将v1和v2元素互换。同上操作。
<5>map容器
map<类型1,类型2>变量名;
ma.begin()返回map第一个元素的指针
ma.end()返回最后一个元素的指针
ma.size()返回map的元素个数
ma.count(n)如果n存在map中返回存在的个数,没有返回0;
ma.clean()清空map
ma.lower_bound()返回键值大于等于给定元素的第一个位置
<6>cmath
abs();整数绝对值
ceil();向上取整
fabs();浮点数绝对值
floor();向下取整
exp(n);e的n次方
log(n);logn
log10();类似以10为底
pow(x,y);x的y次方
sqrt(x);x的开方
cos(); sin();tan(); 三角函数值
cosh();sinh();tanh();双曲线三角函数值
acos();asin();atan();反三角函数值
<7> iomanip
setprecision(x)输出x位(fixed前面必须加这个)
setw(n)输出的字符宽度是n位
setfill(ch)当字符宽度大于输出宽度用ch填写
<8>iostream
fixed用固定的输出浮点数
scientific 用科学计数法输出
defaulfloat 恢复默认的浮点数表示方法
left左对齐
right右对齐
internal填充字符在整数内部或者浮点数内部
<9>locale 或cctype
isupper()测试是否为大写字母
islower() 测试是否为小写字母
isalpha() 测试是否为大小字母
isdigit() 测试是否为0~9数字
isxdigit() 测试是否为十进制,八进制,十六进制数字
isalnum() 测试是否为字母或者数字
isspace() 测试是否为空格啥的。。。
iscntrl() 测试是否为控制符
isprint() 测试是否为打印字符
isgraph() 测试是否为图形字符
ispunct() 测试是否为标点包括空格
tolower()大写转小写
toupper()小写转大写
<10>cstring
memeset(数组名,数值n,sizeof(数组名) );把数组所有元素换成数值n
strlwr()大写转小写;
strupr()小写转大写
strlen()计算字符串长度