输入输出操作(cstdio头文件):
scanf(字符串,参数的地址):(int)读入参数,返回成功读取的参数的个数。
printf(字符串,参数):(int)将参数格式化后(如果有参数的话)和字符串中其他内容一起输出,返回输出的字符个数(包括'\n'、'\t'、空格等,但不包括结束标记'\0')。
sscanf(字符串名s,字符串,参数的地址):(int)从s中读入参数,返回成功读取的参数的个数。
sprintf(字符串名s,字符串,参数):(int)将参数格式化后(如果有参数的话)和字符串中其他内容一起从s的开头写入s中(覆盖掉s原来的内容),返回写入s的有效字符(非结束标记'\0'的字符)的个数(s的字节长度不能小于写入s的字符个数+1,因为字符串一定要以'\0'作为结束标记,且这个'\0'一定要在s的合法内存范围之内)。
getchar():(int)读入单个字符,返回字符的ASCII码或EOF。
gets(字符串名s):(char*)读取一整行字符(吞掉回车符'\n')存入s中(存入后s不包括回车符'\n')(s可以是空串),覆盖掉s原来的内容(仍然要求不能越界),返回指向s的第一个字符的指针(即s)。如果一个字符都没有读到且遇到EOF,则字符串s保持原封不动,返回NULL。
fgets(字符串名s,整数n,文件指针f):(char*)从f中读取含有不超过n-1个字符的字符串写入s中(覆盖掉s原来的内容)。如果在读取的过程中遇到回车符'\n',读取会停止,且这个'\n'也会写入s中成为s的最后一个有效字符。上述任何情况都保证s以'\0'作为结束标记(仍然要求不能越界),返回指向s的第一个字符的指针(即s)。如果一个字符都没有读到,则字符串s保持原封不动,返回NULL。
数组的整体操作(cstring头文件):
memset(数组名a,值v,sizeof(数组名a)):(void)将a的所有元素的所有字节初始化为值v(按照单字节整数的补码规则)。
memcpy(数组名b,数组名a,sizeof(数组名a)):(void)将a的所有元素按每个字节从b的开头全部复制到b中,覆盖掉b原来的内容,a原封不动(仍然要求不能越界)。
memcpy(数组名b,数组名a,sizeof(a的元素类型)*个数k):(void)将a的前k个元素按每个字节从b的开头全部复制到b中,覆盖掉b原来的内容,a原封不动(sizeof(a的元素类型)*k表示要复制的字节数)(仍然要求不能越界)。
字符串的操作(cstring头文件):
strchr(字符串名s,字符名c):(char*)返回指向s中出现最先的c的字符指针,如果s中不存在c,则返回NULL。
strlen(字符串名s):(unsigned long long)返回s的实际长度(不包括结束标记'\0')。
strcpy(字符串名a,字符串名b):(char*)把b复制到a中覆盖a原来的内容,b原封不动,返回指向a的第一个字符的指针(即a)(仍然要求不能越界)。
strcmp(字符串名a,字符串名b):(int)按字典序和ASCII码比较a和b的相对大小,若a和b相等,则返回0,否则返回a和b的第一位不相同字符的ASCII码的差值(a-b)。
strcat(字符串名a,字符串名b):(char*)将b不留空地连接在a的后面,b原封不动,返回指向a的第一个字符的指针(即a)(仍然要求不能越界)。
字符属性(cctype头文件):
isalpha(字符名c):(bool)返回c是否为英文字母(大写或小写)。
isdigit(字符名c):(bool)返回c是否为阿拉伯数字。
isprint(字符名c):(bool)返回c是否为可打印字符(ASCII范围:32~126)。
toupper(字符名c):(char)若c是小写字母,返回对应的大写字母,否则返回c本身。
tolower(字符名c):(char)若c是大写字母,返回对应的小写字母,否则返回c本身。
模板(各种类型通用):
template<class 模板名>
注意:若要使用模板,在每个自定义函数前都必须加上此定义。
排序(algorithm头文件):
sort(头指针l,尾指针r):(void)将左闭右开区间[l,r)中的元素从小到大排序。时间复杂度O(nlogn)。
sort(头指针l,尾指针r,自定义比较函数cmp):(void)将左闭右开区间[l,r)中的元素按自定义比较顺序排序。时间复杂度O(nlogn)。
检索(algorithm头文件):
lower_bound(头指针l,尾指针r,指定元素x):(iterator)在一个已经升序排序好的左闭右开区间[l,r)中返回第一个大于或等于x的位置指针;若所有元素都小于x,则返回尾指针r。时间复杂度O(logn)。
upper_bound(头指针l,尾指针r,指定元素x):(iterator)在一个已经升序排序好的左闭右开区间[l,r)中返回第一个大于x的位置指针;若所有元素都小于或等于x,则返回尾指针r。时间复杂度O(logn)。
去重(algorithm头文件):
unique(头指针l,尾指针r):(iterator)在一个已经有序的左闭右开区间[l,r)中将不重复的所有元素按照原来的顺序堆积在区间内左侧,并覆盖掉原来的元素,其后的元素保持不变。返回去重后的最后一个元素所在位置的后一个位置指针。
不定长数组:vector<类型名>变量名(vector头文件):
.size():(unsigned long long)返回数组元素个数。
.begin():(iterator)返回数组首位置(vector中元素在内存中连续存储)。
.end():(iterator)返回数组尾位置的下一个位置(vector中元素在内存中连续存储)。
.resize(指定大小n):(void)改变数组大小为n,留下前n个元素,后面的元素截断舍弃;若n大于数组原大小,则在数组末尾加入未初始化的元素直到大小为n为止。
.push_back(元素x):(void)在数组末尾添加x。
.pop_back():(void)如果数组中还有元素,删除数组最后一个元素。
.clear():(void)清空数组。
.empty():(bool)返回数组是否为空。
vector<类型>变量名a(长度n):(void)将数组a的长度初始化为n。
vector<类型>变量名a(长度n,值v):(void)将数组a的长度初始化为n,每个元素的值初始化为v。
集合1(不可重):set<类型名>变量名
集合2(可重):multiset<类型名>变量名
(set头文件):
.insert(元素x):(void)在集合中添加元素x(set只添加一次)。时间复杂度O(logn)。
.size():(unsigned long long):返回集合所有元素的个数。
.count(元素x):(unsigned long long)返回集合中元素x的个数。时间复杂度O(logn)。
.erase(元素x):(unsigned long long)返回集合中元素x的个数,若有,顺便将其全部删除。时间复杂度O(logn)。
.erase(迭代器it):(void)删除迭代器it所指向的元素。时间复杂度O(logn)。
.erase(头指针l,尾指针r):(void)删除集合中左闭右开区间[l,r)中的元素(集合中元素已经从小到大排好序,但非连续存储)。
.clear():(void)清空集合。
.empty():(bool)返回集合是否为空。
.lower_bound(指定元素x):(iterator)作用同上(集合中元素已经从小到大排好序,但非连续存储)。
.upper_bound(指定元素x):(iterator)作用同上(集合中元素已经从小到大排好序,但非连续存储)。
.begin():(iterator)返回集合首位置(集合中元素已经从小到大排好序,但非连续存储)。
.end():(iterator)返回集合尾位置的下一个位置(集合中元素已经从小到大排好序,但非连续存储)。
.find(指定元素x):(iterator)返回第一次在集合中出现的元素x所在的位置,若元素x不存在,则返回end迭代器。
set_union(集合A的头指针,集合A的尾指针,集合B的头指针,集合B的尾指针,inserter(集合C,集合C的头指针)):(void)将集合A与B的“并集”存放入集合C中(对于每一个元素x,C.count(x)==max(A.count(x),B.count(x)))。
set_intersection(集合A的头指针,集合A的尾指针,集合B的头指针,集合B的尾指针,inserter(集合C,集合C的头指针)):(void)将集合A与B的“交集”存放入集合C中(对于每一个元素x,C.count(x)==min(A.count(x),B.count(x)))。
映射:map<键类型名,值类型名>变量名(map头文件):
.clear():(void)清空所有的键和值。
.count(元素x):(bool)返回x是否在键中。时间复杂度O(logn)。
.erase(元素x):(bool)返回键中是否有x,若有,顺便将其及其对应的值删除。时间复杂度O(logn)。
.erase(头指针l,尾指针r):(void)删除映射中按键排列的左闭右开区间[l,r)中的键和值(map已经按键的值从小到大排好序,但非连续存储)。
.empty():(bool)返回键和值是否为空。
.lower_bound(指定键x):(iterator)作用同上(map已经按键的值从小到大排好序,但非连续存储)。
.upper_bound(指定键x):(iterator)作用同上(map已经按键的值从小到大排好序,但非连续存储)。
.begin():(iterator)作用同上(map已经按键的值从小到大排好序,但非连续存储)。
.end():(iterator)作用同上(map已经按键的值从小到大排好序,但非连续存储)。
栈:stack<类型名>变量名(stack头文件):
.push(元素x):(void)将x入栈。
.pop():(void)如果还有元素,将最顶元素弹出栈。
.top():(元素类型)如果还有元素,返回栈顶元素(不删除)。
.empty():(bool)返回栈是否为空。
队列:queue<类型名>变量名(queue头文件):
.push(元素x):(void)将x加入队尾。
.pop():(void)如果还有元素,将队首元素出队。
.front():(元素类型)如果还有元素,返回队首元素(不删除)。
.empty():(bool)返回队列是否为空。
双端队列:deque<类型名>变量名(queue头文件):
.size():(unsigned long long)返回队列元素个数。
.resize(指定长度n):(void)改变队列长度为n,留下前n个元素,后面的元素截断舍弃;若n大于队列原大小,则在队列末尾加入未初始化的元素直到大小为n为止。
.front():(元素类型)如果还有元素,返回队首元素(不删除)。
.back():(元素类型)如果还有元素,返回队尾元素(不删除)。
.push_front(元素x):(void)在队列前端添加x。
.pop_front():(void)如果队列中还有元素,删除队列最前一个元素。
.push_back(元素x):(void)在队列末尾添加x。
.pop_back():(void)如果队列中还有元素,删除队列最后一个元素。
.clear():(void)清空队列。
.empty():(bool)返回队列是否为空。
优先队列1:priority_queue<类型名>变量名;
越大的元素优先级越高。
优先队列2:priority_queue<类型名,vector<类型名>,greater<类型名> >变量名;
越小的元素优先级越高。
优先队列3:priority_queue<类型名,vector<类型名>,自定义比较结构体(结构体内用bool重载括号操作符“()”且带有两个参数)cmp>变量名;
自定义优先级设定方法。
(queue头文件):
.push(元素x):(void)将x加入优先队列。
.pop():(void)如果还有元素,将优先级最高的元素出队。
.top():(元素类型)如果还有元素,返回优先级最高元素(不删除)。
.empty():(bool)返回优先队列是否为空。
bitset(bitset头文件)
bitset<二进制位数n>变量名:声明一个含有n位二进制数的bitset,默认其全部位为零。
bitset<二进制位数n>变量名(数值v):声明一个含有n位二进制数的bitset,其二进制值等于v。
bitset<二进制位数n>变量名(string(“字符串s”)):声明一个含有n位二进制数的bitset,其二进制值为s所表示的二进制数(s中的低位字符对应bitset中的高位)。
.any():(bool)返回bitset中是否含1。
.none():(bool)返回bitset中是否全为0。
.count():(unsigned long long)返回bitset中有几个1。
[pos]:访问第pos位(类似于数组,bitset位数从0编号)。
.set():(unsigned long long)将bitset所有位设为1。
.reset():(unsigned long long)将bitset所有位设为0。
.flip():(unsigned long long)将bitset所有位取反。
bitset也可以进行位运算,原则和整数一致,返回一个同等长度的bitset。