1、如有double型*int 型,一定要用如下的规则,ans(double型)=double*int,一定要double先放在前面,否则会出现错误答案。
2、字符串以及map的参数传递速度较慢,如作函数的参数,加上引用,如 void change (map<string,int> &a,)。
3、对于STL中的容器,一般是得用相应的函数进行赋值的,否则会出现未知错误。如<vector>中,当没有声明需要初始的矢量数量时,fac[i]=temp 是不行的,得用fac.push_back(temp);但如map就可以,map['A']=1是可以的。如有vector <int> fac(5),此时直接当数组用既可。
4、对于string容器,虽然可以printf(“%s”,str.c_str); 进行输出,但是不能用scanf("%s",str.c_str);进行输入,得用+=操作或者cin、gelin(cin,str);
5、当数据量较大时,如PAT 甲级A1091 用到了三位数组,设置void BFS()且采用全局变量cnt进行计数、即在BFS内部进行的赋值的方法会容易引起超时,应该采用int BFS()、返回每次BFS的计数结果后进行计数。(相关代码参照以下链接)
PAT 甲级A1091 Acute Stroke (30 分)_nekoha_dexter的博客-优快云博客
6、对于hash方式,如果设置成返回类型为bool的判断函数,请写return false 和return ture,会比return 0,return 1快。虽然return 0,return 1 结果不会出错且编写方便。(相关代码参照以下链接)
PAT 甲级A1091 Acute Stroke (30 分)_nekoha_dexter的博客-优快云博客
7、 当循环控制出现与初设的循环次数不同时,有可能是 连续输入某几个数时,有一两个数的数据类型和输入的数据类型不同。例如 int n,p , r ; scanf(“%d%lf%lf”, &n,&p,&r); 输入三个数, 10、1.80和1.00 。 此时用n 控制循环的话会出错。
8、当希望将一位数组赋初值为 -1 时,如 int hashtable 【maxn】 = {-1}; 此时只有第一个元素是 -1。应该用memset (hashtable , -1,sizeof (hashtable));
9、在创建AVL树时,在左右旋的操作中,一定要先更新原本的root 结点的高度,再更新新的root结点的高度,因为在旋转后新的root结点(一般命名为temp)的高度受原本的root 结点的高度影响的。且左右旋的操作函数中一定要用引用型,因为root 指针的指向要改变,从而可以指向新的 root 结点。
10、当vector 进行 resize() 操作后,将其视为数组,相应的push、size、等操作均失效,且当vector 是空的时候, 不能进行insert 操作。
11、当一个a【10000】【10000】,进行相关的o(n^2)级别的运算,超时时,可以试着用在main 内 求出具体的 范围 用int a【m】【n】;来替代。
12、在用结构体中构造函数时会用到结构体的名字,如struct Node{int v ,j; Node(int_v, int _j).......},在构造cmp时,cmp( Node a, Node b)时 编译器 会出错,无法识别是结构体Node 还是 构造函数 Node
13、当定义了一个vector, 且进行了 vector.resize(n)操作, 那么接下来在cmp排序中不能用 sort(vector.begin(), vector.end(), cmp); 否则后面 值为 0 的项都会移到前面来: 用sort(vector.begin(), vector.begin() + n, cmp); 由此也可知resize() 后初始值均为 0。
14、出现了与预期值差很远的输出一定要先看一下代码, 如输出double, 但用int 存储, 则会差的很多。
15、struct Node{int a, b;}; vector<Node> ans;在输入时,可能会犯这样的错 ans.push_back({b, a}), 把应该在 a 位置 的值放到了b 位置。
遇到新的问题会及时更新。