C++刷题知识点
加速输入输出
当碰到ACM模式下的笔试题,使用C++的cin
和cout
流,通常会比C原生scanf
和printf
慢很多。原因是C++为了兼容scanf
和printf
,做了很多设计。但通常而言,使用cin
和cout
会比scanf
和printf
顺手很多。为了兼顾感觉和效率,可以在代码中添加以下两行,关闭对C的兼容。此时,C++原生输入输出就得到了大幅加强。
std::ios::sync_with_stdio(false);
std::cin.tie(0);
获取整数的最大值和最小值
C++的有符号整数使用4字节进行存储,取值范围为-2^32
至2^32-1
。有时需要取到这类极值。在C语言下可以使用#include<limits>
,C++下转换成#include<climits>
.
最大值:INT_MAX
最小值:INT_MIN
以上二值直接使用即可.
取余和取整
有时候需要对数字进行取余等操作,C++的取余和取整操作如下
int sum = 23;
cout << sum / 10 << endl; // 输出 2
cout << sum % 10 << endl; // 输出 3
Auto自动推断类型
Java在遍历数组的等操作时,既可以使用访问数组下标的方式,也可用Iteable
迭代器的方式。C++中的Auto可以提供类似Java迭代器写法的语法糖。
例如:
// 数组下标访问方式
int q[3] = {1,2,3};
for(int i = 0; i < 3; i++) cout << q[i] << endl;
// Auto关键字自动推断取值
for(auto i:q) cout << i << endl;
列表初始化
列表初始化的特性是在C++11之后生效,目的是方便对结构体的变量初始化。LeetCode官方推荐使用列表初始化的方式,对链表、树等数据结构初始化。
// Leetcode 官方例子
// 二叉树
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),right(right) {}
};
// 链表
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};