刷题-语言技巧
1.输入
scanf
- %c:读入单个字符,可读入空格以及换行符
- %s:读入时以空格以及换行符为结束标志
- %[](字符串集合):
- %[0-9]表示只读入'0'到'9'之间的字符
- %[a-zA-Z]表示只读入字母
- %[^a-z]就表示读入小写字母之外的字符
- %n[^=]读入 = 号前的至多n 个字符
getline(cin,s)
- 将一整行作为字符串读入,以换行符作为结束标志
- 使用前要将缓冲区的换行符用其他输入函数读出
getchar()
- 入单个字符,可读入空格以及换行符
cin
- cin.getline(str),将字符串读入到字符串数组中
- 提高读写效率:
- 可通过ios::sync_with_stdio(false);来解除与C的输出流的绑定,从而提高读写效率
- 可通过cin.tie(0)解除cin与cout的绑定,从而提高读写效率
2.输出
printf
- double类型的输出格式为%f
- printf输出不会换行,需要加上“\n”
- 格式输出:%-md(对不足m位的整型进行左对齐输出,高位用空格补齐)
- 格式输出:%md(对不足m位的整型进行右对齐输出,高位用空格补齐)
- 格式输出:%0md(对不足m位的整型进行右对齐输出,高位用0补齐)
- 格式输出:%.mf(让浮点数保留m位小数输出,保留规则为“四舍六入五成双”)
cout
- 格式输出:left、right(左对齐、右对齐)
- 格式输出:(
)setfill(int ch)(设置填充字符为ch) - 格式输出:(
)setw(int w)(设置域的宽度) - 格式输出:(
)setprecision(int p)(设置数值的精度(四舍五入))
3.变量类型
- C++中常量INT_MAX和INT_MIN分别表示最大、最小整数
- 对于浮点型,一般选用double类型
- 浮点数的比较:
- 定义const double eps=10^(-8);
- 通过浮点数a和浮点数b做差,然后和eps进行比较,做出大小判断
- 圆周率定义:const double Pi = acos(-1);
4.数据结构
数组
- 初始化:
- 数组大小必须是整数常量,不可以是变量
- 可以用{}对数组符初值,数组剩余部分默认值初始化
- 若数组需要的空间较大,可以在主函数外部定义,主函数外部允许申请的空间大,来自静态存储区
- (指针类型)malloc(sizeof(type)*n)进行空间的申请,注意最后需要进行空间的释放
- fill(数组名,数组名+长度,值):按照单元赋值,可以赋值任何值
- memset(数组名,值,sizeof(数组名)):对数组每一个元素赋值,一般用来对char数组进行赋值,建议int数组赋值0或者-1(memset函数按字节填充)
- 字符串数组的末尾有“\0”字符作为结束标志,若用getchar读入的字符串,需要在数组尾部添加“\0”,否则会输出乱码
5.常用包
math
-
fabs(double x):对double型变量取绝对值
-
floor(double x)和ceil(double x):分别对double型变量向上取整和向下取整
-
pow(double r,double p):r和p都是double型,返回r^p
-
sqrt(double x):返回double类型的算术平方根
-
log(double x):返回double类型变量的以自然对数为底的对数
-
sin(double x)、cos(double x)和tan(double x):返回double型变量的正弦值、余弦值和正切值
-
asin(double x)、acos(double x)和atan(double x):返回double型变量的反正弦值、反余弦值和反正切值
-
round(double x):对输入double型变量x四舍五入,返回double型
string.h
- strlen():获取字符串数组中第一个“\0”前的字符个数
- strcpy(字符串数组1,字符串数组2):将字符串数组2复制给字符串数组1,复制包括“\0”
- strcat(字符串数组1,字符串数组2):将字符串数组2接到字符串数组1后面
- 包含memset(变量名,值,sizeof(变量名))函数
bitset
- 定义:相当于一个二进制的数组,并且可以直接用01串赋值,也可以直接进行位运算
- 初始化:bitset
bitset(s/n); - 常用函数:
- size() 返回 std::bitset 的长度
- count() 返回 std::bitset 中值为 1 的位的数量
- any() 返回 std::bitset 中是否存在值为 1 的位
- none() 返回 std::bitset 中是否所有位都是 0
- all() 返回 std::bitset 中是否所有位都是 1
- test(pos) 返回 std::bitset 中位于 pos 位置的值
- set(pos) 将 std::bitset 中位于 pos 位置的值设为 1
- reset(pos) 将 std::bitset 中位于 pos 位置的值设为 0
- flip(pos) 将 std::bitset 中位于 pos 位置的值取反
- to_ulong() 返回 std::bitset 转换成的无符号整数值
- to_ullong() 返回 std::bitset 转换成的无符号长整数值
vector
- 初始化:vector<typename> name;
- 访问:
- 下标访问
- 迭代器访问:vecto<typename>::iterator it;
- vi[i] 等价于 (vi.begin() + i)
- 支持vi.begin()+number;
- 左闭右开,end()作为迭代器结束标志,不存储任何元素
- 常用函数:
- push_back()
- pop_back()
- size()
- clear()
- insert(it,x):向迭代器it处添加一个元素x
- erase():
- erase(it)删除迭代器it处的单个元素
- erase(first,last)删除迭代器[first,end)内的所有元素
set
- 内部自动有序且不含重复元素的容器
- 初始化:set<typename> name;
- 访问:
- 只能通过迭代器访问,set<typename>::iterator it,不支持s.begin()+number
- 可以使用s.rbegin访问最后一个元素
- 常用函数:
- inset():insert(x)将x插入到set容器中
- find():find(value)返回对应值为value的迭代器,若无则返回s.end()
- erase():
- erase(it)删除迭代器it处的单个元素
- erase(value)删除值为value的单个元素
- size()
- clear()
- 扩展:unordered_set为不排序的无重复元素的容器
string
- 初始化:string str ; string str="abcd" ;只能通过cin和cout输入输出
- 访问:
- 下标访问:下标访问的元素的类型为char
- 迭代器访问:string::iterator it;
- 支持str.begin()+number;
- str[i] 等价于 (str.begin() + i)
- 左闭右开,end()作为迭代器结束标志,不存储任何元素
- 常用函数:
- 运算符+
- 比较运算符
- length()/size()
- insert():
- insert(pos,string)在pos位置插入字符串string;
- insert(it,it2,it3)将串[it2,it3)插入到原字符串迭代器it的位置上
- insert(pos,n,c)在pos位置插入n个字符c
- erase():
- str.erase(it)删除迭代器it处的单个元素;
- str.erase(first,last)删除区间[first,last)的元素
- clear()
- substr():substr(pos,len)返回从迭代器pos位开始、长度为len的子串
- find():
- str.find(str2),返回str2在str第一次出现的位置,否则返回string::npos;
- str.find(str2,pos),返回从pos位开始的str2在str第一次出现的位置,否则返回string::npos
- replace():
- str.replace(pos,len,str2)把str从pos位开始、长度为len的子串替换为str2;
- str.replace(it1,it2,str2)把str的迭代器[it1,it2)范围内的子串替换为str2
- to_string():将数字常量转换为字符串
- stoi(str):将字符串转换为int型
- stold(str):将字符串转换为double型
- isalnum() 如果参数是字母数字,即字母或者数字,函数返回true
- isalpha() 如果参数是字母,函数返回true
- iscntrl() 如果参数是控制字符,函数返回true
- isdigit() 如果参数是数字(0-9),函数返回true
- isgraph() 如果参数是除空格之外的打印字符,函数返回true
- islower() 如果参数是小写字母,函数返回true
- isprint() 如果参数是打印字符(包括空格),函数返回true
- ispunct() 如果参数是标点符号,函数返回true
- isspace() 如果参数是标准空白字符,如空格、换行符、水平或垂直制表符,函数返回true
- isupper() 如果参数是大写字母,函数返回true
- isxdigit() 如果参数是十六进制数字,即0-9、a-f、A-F,函数返回true
- tolower() 如果参数是大写字符,返回其小写,否则返回该参数
- toupper() 如果参数是小写字符,返回其大写,否则返回该参数
map
- 映射,可以将任何基本类型映射到任何基本类型,会依据键从小到大的顺序自动排序
- 初始化:map<typename1,typename2> mp;
- 访问:
- 下标访问:map中的键是唯一的
- 迭代器访问:map<typename1,typename2>::iterator it;
- it->first访问键,it->second访问值
- 常用函数:
- find():find(key)返回键为key的映射的迭代器,若没找到则返回mp.end()
- insert():插入元素,不会覆盖已有元素
- erase():
- mp.erase(it)删除迭代器it的元素;
- mp.erase(key)删除键为key的映射
- mp.erase(first,end)删除[first,last)区间的元素
- count():如果容器具有与键 k 关联的值,则返回 1,否则返回 0。
- size()
- clear()
- 扩展:unordered_map为无序映射
queue
- 队列,先进先出,使用时要注意判空
- 初始化:queue<typename> name;
- 访问:front()访问队首元素,back()访问队尾元素
- 常用函数:
- push()
- front()、back()
- pop()
- empty()
- size()
priority_queue
- 优先级队列(优先级可以由用户自己定义),队首元素的优先级最高,默认数字大的优先级高
- 初始化:
- priority_queue<typename> name;
- priority_queue<typename,容器(承载底层的容器),less<tyename>(greater<typename>)> name,less<typename>表示数字大的优先级越大,而greater<typename>表示数字小的优先级越大
- priority_queue<typename,容器,cmp(函数)> name;优先队列中的cmp与sort中的com效果相反
- 访问:top()访问队首元素,及优先级最高的元素
- 常用函数:
- push()
- top()
- pop()
- empty()
- size()
stack
- 栈,先进后厨
- 初始化:stack<typename> name;
- 访问:只能通过top()来访问栈顶元素
- 常用函数:
- push()
- top()
- pop()
- empty()
- size()
pair
- 对,两个元素绑在一起
- 初始化:pair<typename1,typename2> name;
- 临时构建:
- pair<typename1,typename2>(typename1实例,typename2实例)
- make_pair(typename1实例,typename2实例)
- 访问:p.first访问第一个元素,p.second访问第二个元素
- 常用函数:
- 比较操作数
- 扩展:代替二元结构体;作为map键值插入
algorihm
- 它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范 围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
- max()、min()、abs(x(x为整数))
- accumulate(v.begin(), v.end(), init)(头文件
) - max_element(iterator start, iterator end):返回向量最大值对应的迭代器,若范围中有多个元素等价于最大元素,则返回指向首个这种元素的迭代器。若范围为空则返回 last 。
- swap()
- reverse()
- fill(first,last,num)
- 初始化二维数组: fill(e[0], e[0] + row * col , num);
- sort(first,last,cmp)
- lower_bound(first,last,val):寻找范围[first,last)第一个值大于等于val的元素的位置,返回指针(数组)或迭代器(容器),若不存在则返回可以插入该元素的位置(即假设存在该元素时,该元素应当在的位置)
- upper_bound(first,last,val):寻找范围[first,last)第一个值大于val的元素的位置,返回指针(数组)或迭代器(容器)若不存在则返回可以插入该元素的位置(即假设存在该元素时,该元素应当在的位置)
- 不修改内容的序列操作
- count():返回值等价于给定值的元素的个数
- cout_if():返回值满足于给定条件的元素的个数
- find((InputIterator first, InputIterator last, const T& val):返回第一个值等于给定值的元素,如果查找失败,则该迭代器的指向和 last 相同。
- find_if():返回第一个值满足给定条件的元素
- for_each():对范围内的每一个元素调用指定函数
- 修改内容的序列操作
- remove():将一个范围中值等价于给定值的元素删除
- remove_if():将一个范围中值满足给定条件的元素删除
- replace():将一个范围中值等价于给定值的元素赋值为新的值
- replace_if():将一个范围中值满足给定条件的元素赋值为新值
- unique():删除指定范围中的所有连续重复元素,仅仅留下每组等值元素中的第一个元素
作者:方知有
Motto: 热爱可抵岁月漫长
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
所有评论和私信都会在第一时间处理,如有问题或建议,请多多赐教!
支持博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!