acwing语法基础课笔记,结合柳婼的pdf
1 变量、输入输出、表达式与顺序语句
1.1 常用头文件
iostream包括cin、cout、scanf、printfcstdio包括scanf、printfcmath,相当于C语言里面的math.hcctype,相当于C语言里面的ctype.hcstring,相当于C语言里面的string.h- 万能头文件
bits/stdc++.h
1.2 数据类型
- bool
- int 2B
- long 4B
- long long 8B
- float 6~7位小数,4B
- double 15~16位小数,8B
- long double 16B
1.3 字符的读入
1 | scanf("%c%c", &a, &b); // 会把空格读入 |
1.4 OJ系统的输出格式问题
- 忽略每一行末尾的空格
- 忽略输出结果最后的换行符
1.5 max数学表达式的理解
$max=\frac{a+b+\vert a-b\vert}{2}$
因为 “ 短 + 二者之差 = 长 ”
所以有 “ 长 + ( 短 + 二者之差 )= 长 + 长 = 2 * 长 ”
2 scanf/printf语法及判断语句
1 | cin.tie(0);//代码优化 |
判断浮点数是否为0:
1 | !x |
3 循环语句
3.1 输入函数返回值的妙用
1 | if(cin >> x && x > 0) {...} // 写法1 |
3.2 逗号运算符
C++的,运算符对逗号前后的表达式进行运算,然后舍弃前一个表达式的返回值,仅仅返回最后一个表达式的返回值,例
1 | if (表达式1, 表达式2, 表达式3) {...} |
等价于
1 | 表达式1; |
节省了2行代码
4 数组
4.1 浮点数比较问题
C++中,表达式$\sqrt{3}\times \sqrt{3} == 3$并不成立,由于浮点数精读损失,应该用$\vert\sqrt{3}\times\sqrt{3}-3\vert\leq eps$去判断,eps一般取$10^{−6}$
4.2 高精度运算的数组大小问题
计算$2^N$时,可用lg2N估算数组长度
4.3 cstring一些函数用法
memset赋值是按字节赋值,因此只有赋予-1和0时才与预期一致。其最后一个参数的单位是Byte
memset(arr, 0, n * sizeof(int))
memset(arr, -1, n * sizeof(int))
sizeof可不加括号,即可这样使用sizeof a,其返回单位是Byte
memcpy用于拷贝数组,格式为memcpy(dest,src,izeof(src))
4.4 数组初始化的坑
在函数内定义的数组不会自动初始化为0,都是随机数,例如main函数里。而在函数外定义的数组会自动初始化为0。
5 字符串
5.1 读取字符串的方法
C语言方法
1 | char s[N]; |
C++方法:
1 |
|
5.2 字符串操作
C语言方法
1 |
|
C++方法
1 | string str; |
注意:使用+对字符串拼接时,要求左右两边至少有一个string对象,即str = "a" + "b";会报错。
5.3 字符串流
1 |
|
5.4 char数组难点
1 | char a[] = {'C', '+', '+'}; |
6 函数
6.1 函数中的数组参数
1 | int size(int a[]) { |
6.2 默认参数值
1 | void f(int a, int b = 10) {...} // 需要默认值的变量只能放在靠后的位置 |
6.3 内联
1 | inline void f() {...} // 编译时把函数体复制到调用函数的位置,减少函数跳转次数 |
fgets的坑:
fgets会读入\n,因此遍历字符串时,应当用for (int i = 0; str[i] != '\n'; i++),而不能用 for (int i = 0; str[i]; i++)
7 结构体、类、指针与引用
7.1 结构体
1 | // 定义 |
注意:链表中的头结点指的是链表第一个结点的地址,而不是结点本身。
7.2 类
1 | class Node { |
类与结构体的区别:
- 结构体默认是public
- 类默认是private
Leetcode式模板:
1 | class Solution { |
8 STL容器、位运算与常用库函数
8.1 数组类容器
vector
1 |
|
说明:
vector是变长数组,类似java的ArrayLista.begin()返回的是vector第1个元素的地址,而a.end()返回的是最后一个元素的下一个位置的地址a.end() - a.begin() == a.size()*a.begin() == a[0]
queue
1 |
|
注意:
- 队列没有clear()方法
- 优先队列插入时无序,输出时有序
- 优先队列存储自定义类型时,需要重载运算符
- 大根堆重载<
- 小根堆重载>
stack
1 |
|
注意:stack的pop()方法不像java返回栈顶元素!
deque
1 |
|
set
1 |
|
说明:
- 自定义类要求重载<
find()、erase()、lower_bound()和upper_bound()都是O(logn)复杂度count()是O(k+logn)复杂度
unordered_set
1 |
|
bitset
1 |
|
说明:
bitset元素支持位运算符&、|和~等等- 求x的第k位二进制数:
x >> k & 1 - 求x从右起的第1个1:
lowbit(x) = x & -x;- 实际上是原码和补码做与操作
- 例如
110110返回10,11000返回1000
8.2 有序对容器
pair
1 | pair<int, int> a = {5, 6}; |
map
1 |
|
unordered_map
哈希映射,效率更高
8.3 algorithm库
1 |
|
注意:
random_shuffle()常结合ctime的srand( time(0) )使用unique并没有真的删除重复元素,它仅将重复的元素放到非重复元素部分的后边
8.4 cctype头文件中的函数
判断元素是否属于某个类型
isalpha 大小写字母
islower 小写字母
isupper 大写字母
isdigit 数字
isalnum 大小写字母,数字
isblank space 和 \t
isspace space 和 \t,\n,\r
tolower 转换为小写字母
toupper 转换为大写字母
- 本文标题:语法基础
- 本文作者:馨er
- 创建时间:2022-01-11 16:47:37
- 本文链接:https://sjxbbd.vercel.app/2022/01/11/7dfca4941869/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!