-
头文件
- stdio.h
c语言的标准输入输出,常用
printf;scanf
- iostream
c++语言的标准输入输出,重用
cin;cout
- algorithm
c++的常用算法头文件,如
sort;qsort
- stdio.h
-
数组处理
-
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);
头文件:
功能:计算a的b次方
- pow
-
字符处理
- sprintf
printf输出到屏幕,fprintf输出到文件,sprintf输出到字符串
sprintf(a,"%d%d%d",a,b,c);
//a为字符串数组 - tolower
格式:int tolower(int c)或(char 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
strcmp(s1,s2)<0 【注意2】:另外,这个函数在某些编译器上只返回-1,0,1三个值,并不是规定的返回值。所以一般用 <0,>0,=0来判断。
- string对象(c++)
string是c++中的字符对象,头文件
。处理数组比c语言要方便很多,有几个常用的方法:-
erase(int a,int b)
:从下标a起删除b个字符 -
find(string)
:查找string出现的首下标,找不到返回std::string::npos(判断是否找到只能用s.find(str)==std::string::npos) -
c_str()
将string对象转化为c语言字符串。 -
size()
返回字符串大小 -
substr(begin,len)
截取字符串,从下标为begin开始,截取长度为len的字符串,不加len直接截取到最后。 -
replace(begin,len,str)
从下标begin开始,长度为len的字符串替换为str -
insert(begin,len)
从下标begin开始,插入长度为len的字符串 - 取特定下标的字符
string s;char a = s[i];
返回的是char类型。
-
- isalnum
判断字符是否为字母或者数字
- char转string
- 将ascill码转string
to_string(char(‘A’+3))//直接to_string会输出“68” 或者: char a; a = 'A'+3; to_string(a); 或者char('A'+3)+""就直接转化为string
- string(char) 转int
- char转int
atoi
string s = "12"; int a = atoi(s.c_str());
- string 转int
stoi
int a = stoi(string a);
- char转int
- sprintf
-
算法
- 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
- 二分查找
说明:在一个前闭后开的区间里进行二分查找。
1.lower_bound(first,last,key)
2.upper_bound(first,last,key)
3.binary_search(first,last,key)
其中如果寻找的value存在,那么lower_bound返回一个迭代器指向其中第一个这个元素。upper_bound返回一个迭代器指向其中最后一个这个元素的下一个位置(明确点说就是返回在不破坏顺序的情况下,可插入value的最后一个位置)。如果寻找的value不存在,那么lower_bound和upper_bound都返回“假设这样的元素存在时应该出现的位置”。(迭代器相当于一个指针指向数组中的某个元素)
binary_search试图在已排序的[first,last)中寻找元素value,若存在就返回true,若不存在则返回false。
- sort
-
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,后四位赋给btip2:
在输入数值数据或字符串(%d或%s)时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
在输入单个字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符,这时输入时无法用空格,TAB或回车做间隔。
例如:-
scanf("%c%c%c",&a,&b,&c);
输入d e f则把'd'赋予a,' ' 赋予b,'e'赋予c。只有当输入为def时,才能把'd'赋于a,'e'赋予b,'f'赋予c。 - 如果在格式控制中加入空格作为间隔,如:
scanf ("%c %c %c",&a,&b,&c);
则输入时各数据之间可加空格。 - 以%s输入字符串时可以以空格tab或回车做结束,如:
char a[10],b[10];
scanf ("%s%s",a,b);
则输入时各数据之间可加空格或回车。
tip3:
scanf的格式控制部分分为三部分:1格式化说明符,2空白符,3非空白符- 格式化说明符比如%s,%c;
- 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。
- 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
-
-
getchar
getchar函数的返回值是用户输入的字符的ASCII码,如出错返回-1.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。
注:回车符和空格都是字符,所以也会被getchar吸收,所以经常用getchar吸收多余的回车符。 -
gets
gets(a)
是输入一个字符串,存入a.以回车做为结束,但是不以空格结束,这是和scanf的不同.和scanf的相同点是 字符串接受结束后自动加'\0'.例:
#include
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. 清空输出缓冲区。
- puts
-
宏定义
- define
- 简单的宏定义
#define N n*n
- 带参数的宏定义
#denfine n(x) x*x;
- 简单的宏定义
- 常量
- int类型最大最小值:
INT_MIN,INT_MAX
//在头文件limits.h中
- int类型最大最小值:
- define
-
STL
- stack
格式:
stack
a
1.头文件
2.方法:-
pop()
取出头元素,无返回值 -
push(value)
插入元素 -
top()
返回栈顶元素值(注意与pop区别,top是取值不出栈,pop是出栈不取值) empty()
-
- queue
格式:
queue
a
1.头文件
2.方法:-
pop()
取出头元素,无返回值 -
push(value)
插入元素 -
front()
返回队头元素值(注意与pop区别,front是取值不出队列,pop是出队列不取值) -
back()
返回队尾元素 empty()
-
- vector
格式:
vector
a/a[N]
1.头文件2.功能:常用于表示图的邻接表,其功能上相当于一个一维数组。
- 初始化一个vector
vector
a = {1,2,3,5}
vector
a(n,1) //初始化一个有n个元素的数组,每个位置值为1 - 向vector添加一个vector
vector
> a
a.push_back(vector
(3,1))//vector (3,1)是一个包含三个元素的vector,元素值全为1 - 排序
sort(a.begin(),a.end())//默认升序
3.成员方法:
-
push_back(value)
把元素插入末尾 -
size()
返回元素的个数 -
clear()
清空vector中的元素 -
back()
取最后一个值 返回 -
pop_back()
取出最后一个值,不返回 -
erase(iterator index)
删除index指向的元素,如erase(a.begin()+2)
//删除第3个元素
- 初始化一个vector
- set
格式:
set
s
1.头文件
2.功能:集合里面不允许出现重复的值
3.成员方法:insert(value)
-
second
判断插入是否成功,当插入重复的元素时会返回false。代码:if(s.insert(value).second==false) return false
- map/unordered_map
格式:
1.头文件:
2.特性:map是stl中的关联容器,他的元素是一对数据,而像set等是一个数据。map的键唯一,multimap键可以不唯一,内部用红黑树实现,所以是按二叉搜索树严格排序的,查找效率达不到java中hash_map的O(1),为O(logn)。而unordered_map内部是hash表实现的,查找效率可以达到O(1)。
3.格式:map\unordered_map
m
4.成员方法:- 插入
m[2] = 212\\如果键值2已存在,则更新相应的值
m.insert({ 'd', 100 })
- 判空
empty()
- 查找
iterator find (key);\\如果找到则返回该迭代器,否则返回end()
if(m.find(key)!=m.end())
- 插入
- priority_queue
格式:
priority_queue
p
1.头文件
2.功能:优先队列,出队列不再是先进先出,而是优先级最高的先出。内部原理是堆(大顶堆或小顶堆)
3.成员方法:-
push(value)
把元素插入末尾 -
size()
返回元素的个数 -
pop()
队首元素(优先级最高)出队列 -
top()
返回队尾元素(优先级最低)
注意1:priority_queue
默认是大顶堆,priority_queue
是建立一个小顶堆(多加两个参数)。另外,如果是结构体类型,可以在结构体中重载 '<' 号,重定义优先级。类似sort,不过和sort的 '<' 号功能正好相反。看题1416代码。,greater >
注意2:top()返回的元素不能直接修改。即类似s.top()--
这种是错误的。只能先赋值给其他对象再修改再存进去。如q = s.top();q--;s.pop();s.push(q);
这个规则也适合其他STL的top()函数
-
- stack
-
一些方法
- 给一个数组全赋值0的方法
1.memset(..);
2.int a[100] = {0};//这个较简便
- 给一个数组全赋值0的方法