为了备战NOIP2016复习语法和stl库一上午撸了15页

比较重要:

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 输入

fe                      用于输入实数

s                         用于输入字符串

c                         用于输入字符串

x o                  分别是十六进制,八进制输入

<3>printf(没有&地址符)

printf(%d,a);

di(u)                       用于int(无符号)输出

xo                        用于十六进制、八进制输出

cs                         用于单字符、字符串输出

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);en次方

log(n);logn

log10();类似以10为底

pow(xy);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()计算字符串长度

原文地址:https://www.cnblogs.com/srpihot/p/6305456.html