一、 基础架构及定义
#include<...>
定义要包含的头文件和类库#define 常量名 常量值 定义常量
using namespace std;
ifstream fin("流输入文件名");
为文件定义流输入函数fin,函数名fin可自由定义,可为若干个不同的函数名定义各自的输入流。ofstream fout("流输出文件名");
为文件定义流输出函数fout,函数名fout只是一个输出标识符,可自由定义多组标识符与输出流的对应关系。fin.close()
关闭fin的输入流文件(可省略)fout.close()
关闭fout对应的输出流文件(可省略)//注释内容⋯⋯
单行注释- 多行注释
/* 多行注释开始标记
⋯⋯ 注释内容
*/ 多行注释结束标志 - 主函数
MAIN(){...}
主函数无返回值
int main(){... return 0;}
主函数有返回值
二、 #include可包含的库(头文件)
- iostream 标准输入输出流
- fstream 文件输入输出流
- cstdlib c++标准库
- cstdio c++输入输出模块
- CMATH c++数学函数库
- Cstring 字符串
- ctime 时间
- climits 极限库
- cfloat 实数库
- IOMANIP 流输出格式函数库
- algorithm 算法库
- vector 支持动态数组,是扩展栈容器 支持前缀比大小
- map建立两类数据的关联(映射)
- stack 基本栈结构支持s.pop(),s.push(x),s.size(),s.empty()及>,< s.top()
- queue 支持基本队列queue及优先队列priority_queue(堆)基本队列函数:q.pop() q.front() q.push(x) q.back() q.size()在queue中有前缀比较的>和<
- set 支持自平衡查找二叉树结构表示的单值集合set及多值集合multiset,其类函数支持集合的多种运算
- deque 扩展队列结构(循环队列容器) 支持前缀比大小
- list 双向链,用it++或it–在链中寻址也可用push或pop等操作支持前缀>、<比较
- bitset 位向量集合,可当数组使用,支持与或运算
- c语言头文件,如math.h、string.h、stdio.h等
三、 类型
- bool 布尔类型,1字节,非0(false)整数视为1(true)
- char 1字节,可视为有符号整数,其数组可作为字符串使用
- short int 2字节补码整数
- int 4字节补码整数
- long long (int) 8字节补码整数作常量赋值时应带后缀ll2——5的补码整数(有符号)前面加unsigned的前缀就是无符号类型的整数例如unsigned char变为无符号字符或整数
- float 4字节实数(单精度浮点编码)
- double 8字节双精度浮点编码
- long double 12字节长双精度浮点编码
- string 在CSTRING中可用+直接连接两个字符串、可直接赋值,也可用>、<、==等关系符号直接比较还可以向字符数组一样逐字符地访问,结束位置有0。string s的起始位置char* s.c_str()输入时空格默认为间隔符
s.empty()
是s为空的逻辑函数s的长度表示为
s.length()
在s中查找a的起始位置
s.find(string a[,int b])
可选项b表示查询起点,省略表示从头找,找不到该子串就返回“全1”的无符号整数
s.substr(int b[,int l])
表示s中从b开始到串尾(或长度为l)的子串 - FILE *f; 定义文件类型的指针f
- 无类型 void
- 自定义数据类型 typedef
typedef char chuan[100];//定义长度不超100的串类型名chuan
typedef int data[10];//定义名为data的数组类型 - 共用体或联合体
union dt{int x;char y[3];};
main() {
dt a;
cin>>a.y;
cout<<a.x<<endl;
...} - 结构体(或结点)类型的定义
struct node {
int data;
node *next;
node(){next=NULL;}};
最后这行包含了构造函数,此函数在生成结构体变量时会自动触发,它可写可不写。与构造函数相反,析构函数~node(){…}在结构体被释放的时候自动执行。结构体内还可以定义处理该结构体变量的特定函数(例如a.make(x)等),也可以重载运算符。不特别限定时,其内部定义的对象都是public - 类定义class
与14相比,除了把struct换为class以外,其它很相似,只是不特别限定时,其内部定义的对象都是private - 枚举类型enum
enum fangxiang {up,down,left,right};
- 数据对pair,有序二元组
pair<int,int>c;
c.first=1,c.second=3;
pair可作为map的key,建立平面坐标向其他数据的映射
pair可比较,first和second分别为高、低关键字
可用make_pair(x,y)
生成此类数据 - 位压缩集合 bitset 需包含同名类库
容器类型 - 集合与多集 set、multiset,需包含set库
存储结构为红黑树(一种自平衡的查找二叉树),支持元素与集合、集合与集合的各种运算
多集与集合的不同就是允许集合中出现值相等的元素,
查找效率都是log2(n) - 标准队列queue 需要同名类库
queue<int>q;
//可当成数组访问
- 头端
q.front()
- 尾端
q.back()
- 队空
q.empty()
- 队长
q.size()
- x进队
q.push(x)
- 队头元素删除
q.pop()
- 头端
- vector(需包含同名函数库)多种定义形式
vector<类型>标识符 ;
vector<类型>标识符(最大容量);
vector< 类型 > 标识符(最大容量,初始所有值);
//范围内每个变量填充相同初值
-括号中用两个地址参数,用数组中的一段值作初始化
int i[4] = {12,3,4,5};
vector<类型>vi(i,i+2);vector< vector<int> >v;
二维动态容器
定义此类型的迭代器(指针)
vector<int>::iterator it;
相关函数:vi.size()
vi的当前元素总数a.capacity()
则是当前分配给a的空间vi.begin()
vi的开始位置(引用类型)vi.end()
vi的结束位置 引用类型,戌指- 尾追加新元素x
vi.push_back(x)
- 在二维vi中追加一行
vi.push_back(line)
vi.capacity()
可测得当前vi分配的空间vi.clear()
清空vi.insert(it,x)
在vi的it位置插入x或vi.insert(it1,it2,it3)
把it2到it3的数据插入到vi中的it1位置vi.erase(it)
删除vi中it位置的元素此类型可排序、可反排,甚至可直接赋值例如vi=vj
插入溢出重新分配加倍的空间并成片搬移数据
- 扩展队列 deque (需包含deque)
与vector相近,但可灵活地对头尾进行push和pop操作。可利用sort reverse find count max_element min_element lower_bound upper_bound findif等函数进行处理。借助迭代器可进行任意位置上一或多个元素的插入和删除 - 双向队列 list,需包含同名库
用迭代器作++和–的操作可访问后一元素或前一元素 - 优先队列(堆) priority_queue,(需包含 queue)
priority_queue<int>p;
定义大者优先的堆ppriority_queue<int,vector<int>,greater<int> >p;p>p;
定义小者优先的堆p- 堆头
p.top()
为最小或最大 - 支持
p.push(x)
和p.pop()
的操作,代价都是log2(n)
- 关联容器map,需包含同名函数库
查询代价log2(n),可查找、插入、删除、改写、排序
map<key,value>标识符;
例如map<string,int>m;
m.empty()
是否为空m.size()
当前元素总数m.begin()
首元素位置(引用类型)m.end()
末位置m.insert(map<string,int>::value_type("Two",2));
向m中插入(“two”,2)的映射,可用m[“two”]=2实现map<string,int>::iterator it=m.find(2);
在m中找下标是2的位置,没找到则值为m.end()- 此处的it是序号引用,不能做+2或-1等计算
- it->first it->second分别表示下标和值
m.count(key)
是否存在下标是key的映射m.erase(it)
删除一个位置的映射m.erase(it,ti)
删除多个关联
四、 语句
- cin>>… 数据流输入变量(可当有返回值的函数用)
- cout<<.. (可带set函数15、16、17)
- fin>>… 有逻辑返回值TRUE或FALSE
- fout<<…
- 变量=表达式 赋值
特殊情况有简略形式 x+=表达式 ++x x++
可连续赋值,例如 变量=变量=⋯⋯=表达式;
也可在引用前顺带赋值,例如a[i=x+1]=b
不能对普通字符串变量赋值
结合指针的赋值语句用法:
FILE *f;f=fopen("文件名","r");
打开文件准备读FILE *f;f=fopen("文件名","w");
准备写FILE *f=fopen("文件名","a");
准备追加node *p;p=new node;
for(语句组...;条件...;语句组...)循环体;
if(条件){...} else {...}
if(条件){...}
while(条件) 循环体
do 循环体 while (条件);
SYSTEM("PAUSE");停屏幕,
在c语言中用getch() 后者不能用于C++语言中,需用stdio.h支持
char c=getchar()
从键盘读一个字符return 表达式
对于无返回值的函数,执行到该函数最后的}时或执行到无返回值的return时都会结束。break
从当前正在执行的多重分支或当前正在执行的循环体中退出- 多重分支
switch(表达式)
{
case ...:... break;
case ...:... break;
...
default:...} swap(a,b)
交换A B的值srand(time(0)) srand
(随机种子) 随机化语句printf()
函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
- 调用格式为:
printf("<格式化字符串>", <参量表>);
其中格式化字符串包括两部分内容:
- 一部分是正常字符, 这些字符将按原样输出;
- 另一部分是格式化规定字符, 以”%”开始, 后跟一个或几个规定字符,用来确定输出内容格式。
- 参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用”,”分开, 且顺序一一对应, 否则将会出现意想不到的错误。
- printf的格式控制的完整格式:
% - 0 m.n l或h 格式字符
- 下面对组成格式说明的各项加以说明:
%
:表示格式说明的起始符号,不可缺少。-
:有-表示左对齐输出,如省略表示右对齐输出。0
:有0表示指定空位填0,如省略表示指定空位不填。m.n
:m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度,用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。l或h
:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。f格式
:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:%f
:不指定宽度,整数部分全部输出并输出6位小数。%m.nf
:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。%-m.nf
:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。
- e格式:以指数形式输出实数。可用以下形式:
%e
:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。%m.ne
和%-m.ne
:m、n和”-”字符含义与前相同。此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。
- g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。
- 调用格式为:
格式小结:
- 最常用的格式是
%d
,含义是以10进制形式打印一个整数。
如果输出的整数是负数,则输出的第一个字符就是-号。
%d
:按整型数据的实际长度输出。
%md
:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
%ld
:输出长整型数据。 %u
格式与%d
格式类似,只不过要求打印无符号10进制整数。
以无符号十进制形式输出整数。
对长整型可以用”%lu”格式输出。同样也可以指定字段宽度用%mu
格式输出。%o
格式请求输出8进制整数,以无符号八进制形式输出整数。
对长整型可以用%lo
格式输出。同样也可以指定字段宽度用%mo
格式输出。%x
和%X
格式请求输出16进制整数。
%x
格式中用小写字母a,b,c,d,e,f来表示10到15之间的数,以无符号十六进制形式输出整数。- 对长整型可以用
%lx
格式输出。同样也可以指定字段宽度用%mx
格式输出。 %X
格式中用大写字母A,B,C,D,E,F来表示10到15之间的数
共同点:8进制和16进制整数总是作为无符号数处理的。
%s
格式用于打印字符串,与之对应的参数应该是一个字符指针,待输出的字符始于该指针所指向的地址,直到出现一个空字符'\0'
才终止。%s
:例如:printf(“%s”, “CHINA”)输出”CHINA”字符串(不包括双引号)。%ms
:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。%-ms
:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。%m.ns
:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。%-m.ns
:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。%c
格式用于打印单个字符:例如:
printf("%c",c);
等价于 putchar(c);%g
,%f
和%e
这三个格式用于打印浮点值。
%g格式用于打印那些不需要按列对齐的浮点数特别有用。其作用有二:
- 去掉该数尾多余的零(没有达到六位的数)
- 保留六位有效数字(多余六位的)
%e
格式用于打印浮点数时,一律显示地使用指数形式:例如:输出圆周率时是:3.141593e+00
两者的区别:
%g
格式打印出的数是总共6位有效数字%e
格式打印出小数点后的6位有效数字%f
禁止使用指数形式来表示浮点数。因此圆周率输出为:3.141593
(但注意它的精度要求:也是小数点后6位有效数字)
%%
格式用于打印一个%字符。%E
和%G
只是在输出时用大写字母(E)代替了小写字母(e)- 可以在”%”和字母之间插进数字表示最大场宽。
例如:%2d
表示输出3位整型数, 不够2位右对齐。
例如:%5d
表示输出3位整型数, 不够5位右对齐。
例如:%10d
表示输出3位整型数, 不够10位右对齐。
unsigned int i=295; printf("%2d\n",i); printf("%5d\n",i); printf("%10d\n",i); 295 295 295 Press any key to continue
- 补0或者其它
例如: %02d 表示输出3位整型数, 不够2位右对齐,补0。
例如: %05d 表示输出3位整型数, 不够5位右对齐,补0。
例如: %010d 表示输出3位整型数, 不够10位右对齐,补0。
unsigned int i=295;
printf("%02d\n",i);
printf("%05d\n",i);
printf("%010d\n",i);
295
00295
0000000295
Press any key to continue - 负数
int i=-295;
printf("%02d\n",i);
printf("%05d\n",i);
printf("%010d\n",i);
-295
-0295
-000000295
Press any key to continue
- 可以控制输出左对齐或右对齐, 即在”%”和字母之间加入一个”-” 号可 说明输出为左对齐, 否则为右对齐。
unsigned int i=295;
printf("%-02d\n",i);
printf("%-05d\n",i);
printf("%-010d\n",i);
295
295
295
Press any key to continue - 可以在”%”和字母之间加小写字母l, 表示输出的是长型数。
例如:%ld
表示输出long整数
%lf
表示输出double浮点数 %9.2f
表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。
例如:%6.9s
表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除.
实例
`unsigned int i=295; printf("%d\n",i); printf("%1d\n",i); printf("%09d\n",i); printf("%09d\n",(unsigned char)i); printf("%9d\n",(unsigned char)i); printf("%-9d\n",(unsigned char)i); */ 295 295 000000295 000000039 39 39 Press any key to continue
对于m.n的格式还可以用如下方法表示(例)
int m=10,n=5;
char ch[]="abcdefghijklmnopqrst";
printf("%*.*s\n",m,n,ch);//输出为 abcde
前边的*定义的是总的宽度,后边的定义的是输出的个数,分别对应外面的参数m和n。
我想这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式
"%08lx\n",4byte
"%04x\n",2byte
"%-2.2BX",1byte
printf("%d\n",x);
又例如
PRINTF("%.03f",12.3456)
输出12.346
printf("%4d",88)
输出 88
printf("%04d",88)
输出0088
常用格式串
- %lld
8字节整形
- %lf
:双精度实数
- %x
十六进制 0x00 表示十进制0
其它字符按字符串原样打印
continue
结束当前这一次循环体的执行node *p;delete p;
将P结点释放,还给系统
如果在定义NODE时也定义了反构造函数~NODE(),责此函数被触发。scanf("%d",&n)
将整型数据输入到n中,输入格式串决定输入数据的格式。fprintf(f,"%d",n)
向文件F的当前位置输出整数Nfscanf(f,"%d %d",&n,&m)
对于字符串数组&可有可无
char a[10],b[10];
fscanf(f,"%s %s",a,&b);memset(数组名,每字节取值,字节数)
用固定值(0~255)填充指定区域的内存。memcpy(*a,*b,c)
把*b开始的c个字节复制到*a开始的区域。gets(char* a)
让字符串a从键盘得到一个输入行,包括其中的空格
fgets(s,l,f)
从文件f中读取长度不超l的输入行存入s,包括空格freopen("文件名","方式字符",标准输入或输出)
可为标准输入输出重定向
方式字符:r w a,或加’b’表示二进制方式例如wb rb
标准输入用stdin表示,
标准输出用stdout表示。cin.getline(char *s,l)
限制长度为l的行输入
与cin的输入同源,但在cin之后使用时需要用一个
cin.getline(s,0)
把未结束的换行读完,否则容易出错rewind(FILE *f)
将文件f指针置为开始fseek(*f,p,m)
设置文件f的指针位置
- 可用于r和w的方式,不能用于a方式
- p为偏移量,可正可负
m为偏移起点方式代码:0从头,1从当前位置,2从文件尾
fwrite(*p,u,t,*F)
将位置p(无类型指针)开始单位长度u的t项数据写入文件F中fread(*p,u,t,*F)
从文件指针F处读出t项单位长度为u的数据到内存的p位置
上述2语句能对有格式的数据进行输入和输出,文件都是二进制格式(b)strlwr(char *s)
将s中的大写字母转换为小写strupr(char *s)
将s中的小写字母转换为大写fclose(FILE *f)
关闭文件next_permutation(a,a+n);
把a数组中n个元素的全排列变换为下一个排列
此语句需要算法库的支持make_heap(int *a,a+n);
//从a[0]到a[n-1]整体建堆,o(n)代价push_heap(b,b+i+1);
//把b[i]插入从b[0]到b[i-1]的堆中pop_heap(b,b+i);
//利用pop将堆顶删除至堆尾b[i-1]reverse(首地址,末地址)
反排数组,参数可以是指针或线性结构容器的迭代器- 以下三个函数需流输出模块的支持
SETW(X)
指定流输出的场宽SETFILL('C')
把场宽的空余位置填充上指定字符- SETPRECISION(小树位数) (小树位数包括小数点的位置,参数的小树位数不够时不填充无效0)
exit 0;
在子函数中结束整个程序sort(首地址,末地址)
数组升序排序,参数为指针或迭代器
可添加函数指针cmp作为第三参数,解决降序或其他特殊排序要求
bool cmp(const int &a,const int &b) {
return a>b;
}//整数降序排序
bool cmp(const node &a,const node &b) {
return a.x+a.y<b.x+b.y;
}//按两个分量之和升序排序在C语言中还有一种较早期的用法:
qsort(首地址,数据个数,单位数据字节数,比较函数名)
比较函数是自定义的,例如
int cmp(const void *a, const void *b)
{
return ((const Sample *)a)->data - ((const Sample *)b)->data;
}
五 函数
abs()
pow(底数,指数)
底数为实型,结果也是实型strlen(s)
strcat(s1,s2)
将S2接到S1后面并返回S1的地址strcmp(s1,s2)
返回值 1 0 -1strcpy(s1,s2)
可字符串赋值strncpy(s1,s2,n)
将S2的前N个字符复制到S1。如果超长则\0后面的字符将不被复制strstr(s1,s2)
itoa(n,s,10)
将n化为10禁制后转化为数字串存入s中atoi(s)
数字串转数,转换失败前的转换有效atof(char *s)
实数串转实数rand()
产生0到32767之间的随机整数- 类型标识符(数据) 将参数强制转换为指定类型的数据形式
也可用: (类型)数据 来代替 (条件?值1:值2)
条件函数max(x,y)
两个值中的较大值min(x,y)
两个值中的较小值CLOCK()
时钟函数值
每秒增加CLOCKS_PER_SEC,其值常为1000,
有iostream的定义即可- log底数(真数) 省略底数时默认为自然对数
time(0)
时间计数器,每秒加1,一年增加超过30000000sqrt(x)
返回算数平方根sizeof(变量或类型)
返回该变量或类型的字节数fgetc(FILE *f)
返回文件当前指针处读取的字符,指针顺移
例如
while((c=fgetc(f))!=EOF) c-=('a'-'A')*(c>'Z');
此句把c中的字母变大写ftell(FILE *f)
返回文件当前指针位置- &可返回变量首地址,例如
例如&x
,&a[i][0]
make_pair(x,y)
返回由x和y生成的数对- 查找元素x
find(首地址,末地址,x)
返回值是指针或迭代器,若能找到就返回该位置,否则返回末地址(虚地址 - 数据计数
count(首地址,末地址,x)
统计x的个数
此函数用于map类型时,找的是key(first)是否存在
六 运算
- 数值运算 +、-、*、/、%
+-*/有整数加减乘除法和十数加减乘除法两类含义,系统自动辨别,而%只用于整型。
*在定义变量时是地址(指针)的说明符号,与定义好的指针类型变量连用时表示该地址的内存单元 - 关系运算 ==、>、<、>=、<=、!=
- 逻辑运算
!、&&、|| - 位运算
& | ^ ~、>>、<<
其中的&与单个变量作一元运算时是取地址运算 - 运算符重载
struct Sample { int data; };
bool operator == (const Sample &a, const Sample &b) {
return a.data == b.data;
}
inline bool operator != (const Sample &a, const Sample &b) {
return !(a == b);
}
七 运算顺序
() [] -> .
后置++ –
前置++ – ! ~ 正负号+ - 地址* & (类型) sizeof
* / %
+ -
位移<< >>
< <= >= >
== !=
&
^ 异或
|
&&
||
?: 条件赋值
= 赋值
,
六 系统常量
CLOCKS_PER_SEC
clock()
每秒增加的数量,其值常为1000NULL
空地址 0false
逻辑假 0true
逻辑真 1INT_MAX
最大整形INT_MIN
最小整形UINT_MAX
最大无符号整形LLONG_MAX
最大无符号整形ULLONG_MAX
最大无符号长整形DBL_MAX
最大双精度实数,需要cfloatEOF
文件结束