0
点赞
收藏
分享

微信扫一扫

笔记整理(1)

跟着Damon写代码 2022-01-17 阅读 89
c++

头文件
#include <algorithm>
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;

 快捷键 

ctrl+h 替换;

 

 字符串

1、在定义局部变量/数组记得初始化数组(否则会乱码,出现各种而样的问题),在全局变量/数组会自动初始化。
2、比较函数:strcmp(char *str1,char *str2),
从第一个字符开始逐字比较两个字符,字符不相等,则函数返回str1[i]-str2[i](可以通过正负值判断大小)。如果两个字符串完全相同,则会返回0。
在c++里面string类型的可以直接判断大小;
3、strlen():获取字符串长度到‘\0’结束。注意不要将strlen()写在for循环的结束条件里,否则可能会增加时间复杂度。
4、字串查找可以用find(起始位置,结束位置,需要寻找的东西);
5、字符数组一定要留一个位置给‘\0’;
6、cin、scanf都是以空格为结束条件,在输入有空格的情况下可以用fgets,fgets(字符数组(s1),输入的最大长度,stdin)是以‘\n’为结束条件;
gets()是以‘\n’为结束条件,并且不会读入‘\n’;
注意:fgets()会读入最后的‘\n’(windows ‘\n’是两个字符 所以需要将strlen()得到的长度-2);
7、使用多个if的时候如果不用else,就会使用完if,可能还会执行下一个if;

if语句的先后顺序很重要,注意If语句的主次关系!
8、判断奇偶可以通过判断数字的最后一位来判断奇偶性;
9、使用gets()读入字符串一定要注意‘\n \r’;
10、字典序:是一种排序方法:
对于字符串,先按首字符排序,如果首字符相同,再按第二个字符排序,以此类推。
如aa,ab,ba,bb,bc就是一个字典序。

11、字符串插入函数:
数组名字 . insert(需要插入的位置,“需要插入的字符串”); 

 12、string 定义的字符串长度为:字符串名字 . length();

 13、字符串截取函数:
数组名字 . substr(截取的起始位置 , 需要截取字符串的长度);

14、字典序最小一定是升序 

 

 日期            
假设星期为w,年份为y,月份为m,日期为d。
1、w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7可以根据公式将所给日期算出星期几;
把算出来的w加上1就能的到星期几
注意每年的1、2月要当成上一年13、14月计算,上述的除法均为整除。
2、时差需要判断加减;

 3、一定要注意要求的是第15个月还是第14个月(题目问的是第几个月),需不需要把本月的数额加上去;

 

 sort函数:
1、从大到小排序可以使用sort(起始位置,终点位置的下一位,greater<int>());
2、1e-6:(1*10的-6次方);
3、四舍五入函数:round(四舍五入的数); 
4、min()函数一次只能计算两个变量,如果需要计算三个以上的变量可以套用如:min(a,min(b,c));
5、输出的时候注意不要输出行末空格;
6、像成绩排序输出学生的学号的这种排序需要使用结构体进行捆绑然后再排序;bool cmp(结构体的名字 a,结构体定义的名字 b,);
 注意:使用结构体排序的时候,记得把所有的情况都考虑,并排序一下(正常情况下,特殊标注不会相同就不用)如:成绩相同是按学生的首字母排序等;
7、比赛中输入输出都是分开的可以一边输入一边输出;
8、变量初始化的时候使用一个足够小的数(如果最坏的结果是负数的话,初始化零就不对了);
9、定义数组用常量,比题目数据范围稍微大一点;
10、判断浮点数相等应该用极小值eps来辅助,一般eps取1e-8足够了,确保比题目约定的精度误差要求更小。
11、这里inf + inf会溢出,超出了int的范围。可以把inf的定义改成:const int inf = 0x3fffffff,就可以确保不会溢出了。
12、如上的代码可以让dist数组中的所有元素赋值为0x3f3f3f3f,并且两个初始值相加也不会溢出;(某个数的开根号可以使用sqrt()函数也可以是i*i<x;)
13、没有弄清楚操作符优先级。在优先级不确定的情况下,用小括号来明确指定优先级能够避免这类问题的发生。
当然,最好还是要弄清这些符号之间优先级的关系。
14、避免访问非法内存。访问非法内存的事情经常发生,但是可以通过养成好习惯来避免。
比如stack、queue、set访问之前必须先确认不为空;访问指针之前确保指针不是野指针;数组内存开得足够大,等等
15、int值的范围是-2*10^9~2*10^9  long long 范围是9*10^18;

输入输出
1、输入的时候注意判断输入有可能是升序也有可能是降序

2、在scanf里用*修饰符,是起到过滤读入的作用。比如一个有三列数值的数据,我只想得到第2列数值,
可以在循环里用scanf(“%*d%d%*d”,a[i])来读入第i行的第2个数值到a[i]。 
 * 修饰符在printf中的含义完全不同。如果写成printf(“%6d”, 123),很多同学应该就不会陌生了,这是设置域宽的意思。
同理,%6s也是域宽。* 修饰符正是用来更灵活的控制域宽。
使用%*s,表示这里的具体域宽值由后面的实参决定,如printf(“%*s”,6, “abc”)就是把”abc”放到在域宽为6的空间中右对齐。 
明白了 * 是用变量来控制域宽,那么这题就简单了,这里应该填写5个实参。然后字符长度的计算应该用buf而不是s,因为buf才是截断后的长度,用s的话,如果s长度超过了width-2,效果就不对了

3、输入数据可能夹杂着回车,导致输出错误

4、scanf("%[^\n]",a); 表示除了换行符以外的字符全部接收 

 

 

 rand()产生随机数字;

尽量不要用pow()函数(容易出问题); 

 

全排列函数:
next_permutation(起始位置,结束位置);
原理:1、将现有的排列从后往前找,找第一个逆序数(即如果现有排列为123,则第一个逆序数为2)
2、记录第一个逆序数的位置,再从后往前找第一个比逆序数大的数字
3、交换第一个逆序数的值与第一个比逆序数大的数的值
4、将第一个逆序数(不包括此位置)到最后一个数字(包括此位置的数)中的所有数字翻转(利用reverse(初始位置,结束位置));

 

switch函数: 

 switch(判断的变量)
{
case '变量的可能取值':
    执行的操作;
case '变量的可能取值':
    执行的操作;……
}

记录某数字出现的次数可以用数组来记录; 


枚举的时候可以用return 0;直接结束循环枚举 

求最大值或者最小值的时候把变量设成无穷小或无穷大的值;

 

集合是数学中的一个基本概念,通俗地理解,集合是由一些不重复的数据组成的。比如{1,2,3}就是一个有1,2,3三个元素的集合。
集合函数:set(包含在头文件< set >中); 
1、构造一个set的语句为:set<想要构造的类型>+构造的变量名;初始的时候全为空
如:set<int> aa   set<string> bb;
 2、c++中用insert()函数向集合中插入一个新元素。注意如果集合中已经存在了某个元素,再次插入不会产生任何效果,集合中
是不会出现重复元素的
3、c++中通过erase()函数删除集合中的一个元素,如果集合中不存在这个元素,不进行任何操作。(变量名+点+erase(需要删除的元素))
4、c++中如果你想知道某个元素是否在集合中出现,可以使用count()函数。如果集合中存在我们要查找的元素,返回1,否则返
回 0 ;
5、c++通过迭代器可以访问集合中的每个元素,迭代器就好像一根手指指向set中的某个元素。通过*(解引用运算符,不是乘号的意
思)操作可以获取迭代器指向的元素。通过++操作让迭代器指向下一个元素,同理 - -操作让迭代器指向上一个元素。
迭代器的写法比较固定,set<T>::iterator it 就定义了一个指向set<T>这种集合的迭代器 it,T是任意的数据类型。其中::iterator
是固定的写法。(set<T>::iterator部分不要打空格)
begin函数返回容器中起始于元素的迭代器,end函数返回容器的尾后迭代器(即最后一个元素的下一个位置)。
注意:1、用循环遍历每个元素的时候不要用it<country.end();应该使用 it!=country.end();
    输出的时候迭代器前+*号 如(cout<<*it<<endl;)
          2、在c++中遍历set是从小到大遍历的,也就是说set会帮我们排序的。(如果对结构体要使用set的话需要自定义一下小于号)
6、清空set使用clear(),会清空内存(所定义的结构体名称+点+clear())
7、set经常会配合结构体来使用,用set来储存结构体和vector有些区别。正如我们前面所说的那样,set是需要经过排序的。系统自带
的数据类型有默认的比较大小的规则,而我们自定义的结构体,系统是不可能知道这个结构体比较大小的方式的。
所以我们需要用一种方式来告诉系统怎么比较这个结构体的大小。其中一种方法叫运算符重载,我们需要重新定义小于符号。 

 用栈的时候一定要判断栈空还是非空;

举报

相关推荐

0 条评论