#c/c++
-
#####头文件
- stdio.h
c语言的标准输入输出,常用
printf;scanf
- iostream
c++语言的标准输入输出,重用
cin;cout
- algorithm
c++的常用算法头文件,如
sort;qsort
-
#####数组处理
- memcpy
数组a复制k个元素到数组b:
memcpy(b,a,sizeof(int)*k);
数组a全部复制到数组b:
memcpy(b,a,sizeof(a));
- memset
数组a清0:```
memset(a,0,sizeof(a));
>
>这里注意一点,memset对int数组赋初值时**只能赋值0**,其他数都不能赋值,++因为memset赋值的单位是字节,而int是4个字节,所以你赋值0,每字节都是0.所以合起来4个字节也是0,但是赋值其他的数,4个字节合起来就不是原来的数了++。(所以memset大多用来给char数组赋初值,因为char是一个字节)
* #####数学计算
+ pow
>```pow(double a,double b);```
>头文件:```<math.h>```
> 功能:计算a的b次方
* #####字符处理
+ sprintf
>printf输出到屏幕,fprintf输出到文件,sprintf输出到字符串
>```sprintf(a,"%d%d%d",a,b,c);
```//a为字符串数组
+ tolower
> 格式:int tolower(int c)
> 将大写字符转化为小写,***非字母字符不做处理 ***
> 头文件:ctype.h或stdlib.h或iostream或string(4个貌似都可以..)
+ strcmp
> ```int strcmp(const char *s1, const char *s2);```
> 【功能】:比较两个字符串的大小
> 【规则】:字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。
>【返回值】:若参数s1 和s2 字符串相同则返回0。s1 若大于s2 则返回大于0 的值。s1 若小于s2 则返回小于0 的值。
>
>【注意1】:如果s1和s2长度不相等且s1是s2的子串,则s1<s2,即```strcmp(s1,s2)<0```
>
>【注意2】:另外,这个函数在某些编译器上只返回-1,0,1三个值,并不是规定的返回值。所以一般用 <0,>0,=0来判断。
+ string对象(c++)
> string是c++中的字符对象,头文件```<string>```。处理数组比c语言要方便很多,有几个常用的方法:
> 1. ```
erase(int a,int b)
```:从下标a起删除b个字符
> 2. ```
find(string)
```:查找string出现的首下标,找不到返回std::string::npos(判断是否找到只能用s.find(str)==std::string::npos)
> 3. ```
c_str()
```将string对象转化为c语言字符串。
> 4. ```
size()
```返回字符串大小
> 5. ```
substr(begin,len)
```截取字符串,从下标为begin开始,截取长度为len的字符串
> 6. ```
replace(begin,len,str)
```从下标begin开始,长度为len的字符串替换为str
> 7. ```
insert(begin,len)
```从下标begin开始,插入长度为len的字符串
* #####算法
+ sort
>c++排序函数,***在std下***,时间复杂度nlogn
>
>第一个参数是要排序的区间首地址,第二个参数是区间尾地址的++**下一地址**++。比如有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)
>
>`sort(begin,end,compare(默认为升序));`
>```bool compare(int a, int b)
{
return a<b;////这是升序(谁小谁在前面)
}```
* #####c++运算符重载
>type operator sign (parameters);
>运算符重载定义在类或结构体内,只针对此类或结构体的具体运算。
例: ```struct E{
char name[101];
int age;
int score;
E operator + (E b){
b.age = age+b.age;
return b;
}
}
```
>调用:
>```struct a;struct b;struct c;```
1.```c = a + b;```
2.```c=a.operator+(b);```
* #####输入(关于输入输出的细节需看我写的博客)
+ scanf
>tip1:```scanf("%4d%3d",&a,&b)```//输入一个数取其前四位赋给a,后四位赋给b
>
>tip2:
>在输入**数值数据或字符串(%d或%s)**时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用**空格,TAB或回车**作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
>在输入**单个字符数据(%c)**时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符,这时输入时无法用空格,TAB或回车做间隔。
>例如:
>1. ```scanf("%c%c%c",&a,&b,&c);```输入d e f则把'd'赋予a,' ' 赋予b,'e'赋予c。只有当输入为def时,才能把'd'赋于a,'e'赋予b,'f'赋予c。
>2. 如果在**格式控制中加入空格作为间隔**,如:
```scanf ("%c %c %c",&a,&b,&c);```
则输入时各数据之间可加空格。
>3. 以%s输入字符串时可以以空格tab或回车做结束,如:
```char a[10],b[10];
scanf ("%s%s",a,b);```
则输入时各数据之间可加空格或回车。
>
>tip3:
>scanf的格式控制部分分为三部分:1格式化说明符,2空白符,3非空白符
>1. 格式化说明符比如%s,%c;
>2. 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。
>3. 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
+ getchar
>getchar函数的返回值是用户输入的字符的ASCII码,如出错返回-1.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。
>**注:回车符和空格都是字符,所以也会被getchar吸收,所以经常用getchar吸收多余的回车符。**
+ gets
>```
gets(a)
```是输入一个字符串,存入a.以回车做为结束,但是不以空格结束,这是和scanf的不同.和scanf的相 同点是字符串接受结束后自动加'\0'.
>例:
>
```#include <stdio.h>
main()
{
char ch1[10],ch2[10],c1,c2;
scanf("%s",ch1);
c1=getchar();
gets(ch2);
c2=getchar();
}
依次键入asdfg回车,asdfg回车,则ch1=“asdfg\0”,c1=’\n’,ch2=“asdfg\0”,c2需再次输入。
++scanf++ :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,只读取回车空格tab之前的字符。但是回车,空格和tab键仍会留在输入的缓冲区中。
++gets++:可接受包括回车符以及之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中,因为gets会把回车一起读入,并用’/0’替换。
- cin
这个是c++中的输入,头文件为```
>cin和scanf一样,输入的回车和空格可认为停止输入,不会读取,但都会保留在缓冲区内,需要吸收。而gets读取空格,且只以回车为结束标志。
>***注意***:==cin比scanf耗时很多,所以许多比赛建议用scanf而不是cin==
* #####输出
+ puts
>1.puts()函数只用来输出字符串(结尾必须有'\0').没有格式控制,里面的参数可以直接是字符串或者是存放字符串的字符数组名。而printf()函数的输出格式很多,可以根据不同格式加转义字符,达到格式化输出。
>2.puts()函数的作用与语句printf("%s\n",s);的作用形同,**即自动在最后加上换行符**。
+ cout
>cout输出和c的输出不太一样,他是带缓存的,只有缓存满时才输出,利用endl就是直接输出,清空缓存。
>endl的作用:
1. 将换行符写入输出流,其中Unix/Linux换行符是\n,Windows中是\r\n,MAC中是\r;
2. 清空输出缓冲区。
* #####宏定义
+ define
>1.简单的宏定义```#define N n*n```
>2.带参数的宏定义```#denfine n(x) x*x;```
* #####STL
+ stack
> 格式:```stack<type> a```
>1.头文件```<stack>```
>2.方法:
> + ```pop()```
取出头元素,无返回值
> + ```push(value)```
插入元素
> + ```top()```
返回栈顶元素值(注意与pop区别,top是取值不出栈,pop是出栈不取值)
> + ```empty()```
+ queue
> 格式:```queue<type> a```
>1.头文件```<queue>```
>2.方法:
> + ```pop()```
取出头元素,无返回值
> + ```push(value)```
插入元素
> + ```front()```
返回队头元素值(注意与pop区别,front是取值不出队列,pop是出队列不取值)
> + ```back()```
返回队尾元素
> + ```empty()```
+ vector
> 格式:```vector<type> a/a[N]```
>1.头文件```<vector>```
>2.功能:常用于表示图的邻接表,其功能上相当于一个一维数组。
>3.成员方法:
> + ```push_back(value)```
把元素插入末尾
> + ```size()```
返回元素的个数
> + ```clear()```
清空vector中的元素
+ priority_queue
> 格式:```priority<type> p```
>1.头文件```<queue>```
>2.功能:优先队列,出队列不再是先进先出,而是优先级最高的先出。内部原理是堆(大顶堆或小顶堆)
>3.成员方法:
> + ```push(value)```
把元素插入末尾
> + ```size()```
返回元素的个数
> + ```pop()```
队首元素(优先级最高)出队列
> + ```top()```
返回队尾元素(优先级最低)
>注意1:```priority<int>```默认是大顶堆,```priority<int,vector<int>,greater<int> >```是建立一个小顶堆。另外,如果是结构体类型,可以在结构体中重载 '<' 号,重定义优先级。类似sort,不过和sort的 '<' 号功能正好相反。看题1416代码。
>注意2:**top()返回的元素不能直接修改**。即类似```s.top()--```这种是错误的。只能先赋值给其他对象再修改再存进去。如```q = s.top();q--;s.pop();s.push(q);```这个规则也适合其他STL的top()函数
* #####一些方法
+ 给一个数组全赋值0的方法
>1.memset(..);
>2.int a[100] = {0};//这个较简便
来源:CSDN
作者:bobobe
链接:https://blog.csdn.net/u013337743/article/details/68067124