命名空间using namespace std;
for example:将命名空间设置为南昌后,你在南昌大学读书就只用说南大了
如果不写,则输出时要指明std的输出
std::cout<<" "<<std::endl;
endl
不仅起到换行的作用,还能清空输入缓冲区fflush(stdin)
函数模板
template
比较两个整型值的函数为:bool isBiggerThan(int x, int y) { return x>y?true:false; }
比较两个实型值的函数为:bool isBiggerThan(float x, float y) { return x>y?true:false; }
比较两个字符型值的函数为:bool isBiggerThan(char x, char y) { return x>y?true:false; }
仔细观察上面三个函数,除了参数类型不一致,其余完全相同
使用函数模板可以消除重复
上面的三个函数可以写为:
bool isBiggerThan(T x,T y){ return x>y?true:false;}
编译程序在编译时会根据传入的实参的类型使用函数模板生成相应本的函数
最大公约数和最小公倍数
最大公约数
根据数学中的辗转相除法 用较大的那个数做被除数,较小的那个做除数,进行相除,得到的余数再除之前的那个较小的除数,所得的余数再除上一轮的除数,根据余数小于除数的性质,每次所得的余数是逐步减小的,经过有限步后得到的余数必然等于0,倒数第二步所得余数便是所求
递归式:gcd(a,b) = gcd(b,a%b);
边界:gcd(a,0) = a; ---即b = 0;
int gcd(int a,int b){
if(b==0)return a;
else return gcd(b,a%b);
}
最小公倍数
两数的最小公倍数等于两数之积除以它们的最大公约数
a*b/gcd(a,b);
a/gcd(a,b)*b; //防溢出
typedef 类型名称 类型标识符;
常用于简化比较复杂的类型声明(尤其是结构体)
提高程序的可移植性
Example:typedef int ElemType; //给int起个别名ElemType
ElemType a;//等价于int a
看上去不起眼,但如果在程序中有n个地方用到了ElemType类型,现在需要将数据变为字符型,只需要:
typedef char ElemType
局部数组太大会闪退
特别大二的数组应该定义在main()函数外,即定义为全局变量
动态数组使用完毕后需要delete
int *a = new int[n]
....
delete[] a
二维数组要逐行释放空间,最后再释放整个二维数组
int **array = new int*[m];
...
for(int i=0;i<m;i++)
delete[] array[i];
delete[] array
字符串
scanf_s读取字符串要指定缓冲区长度scanf_s(“%s”,a,20);
长度计算
strlen()获取字符串长度,不包括’\0’
sizeof()计算长度会算’\0’
定义字符数组时,若指定长度,则数组长度至少要大于给出的元素个数
char a[8] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’ };
如果恰好等于,则会输出乱码
用strlen和sizeof求长度时,vs下运行得出结果为29,因为它会直到找到’\0’才会终止
char类字符串的读取
cin遇到空格结束
cin.get()遇到换行符结束,且换行符保留在输入序列中,可在使用后再调用一次cin.get(),或者用getchar()吸收掉
cin.getline(str,100)读取99个字符,最后一个默认’\0’,同样遇到换行符结束
可以直接gets(str)读取整个字符数组包括空格
string类字符串的读取
ex:string str;
cin>>str;
getline(cin,str); //该函数需要引入string头文件,而不是cstring;
getline(cin,str,:); //遇到冒号则停止
字符串的拼接、比较、复制、查找
strcat(s1,s2) //拼接,将s2的内容拼接在s1后,更新s1
char类型:strcmp(s1,s2) //比较,返回1、0、-1,从第一个字母开始比较
如果是string,可以直接用算数运算比较大小(><)
strcpy(s1,s2) //将s2的内容复制到s1中,会覆盖s1
str.find(s) //查找,返回索引