摘要
C++ 离散知识点
- 在不同源文件可define同一个宏(宏作用域为从#define开始到当前源文件结束)
- 防止头文件重复包含指的是:防止某个源文件重复包含同一个头文件两次,但是同一个头文件可以同时被不同源文件各包含一次。
- 类一般在头文件中定义,在类内定义的函数默认是
内联(inline)
的,而在类内声明,在类外定义的函数则不默认为内联(inline)
。 - 头文件内定义的变量会自动被加上
extern
。 - 在头文件里定义函数的几种方法:
- 声明类,在类中定义静态成员函数,并在头文件中实现函数。
- 使用模板函数(其要求声明和定义都在头文件中)
(没有试过)
。 - 定义为内联函数
inline
。
C++ 语法
- 负数求余和商都是负数。例如
-123 / 10 = -12
,-123 % 10 = -3
。 string
类型前要加std::
- 定义
std::string a="123456"
, 那么a[a.length() - 1] == '6'
而不是'\0'
。 char a = ''
会报错,因为不能初始化为空字符。至少也要是char a = '\0'
- 注意:栈
stack
没有reserve
方法。(TODO:C++ prime还是算法设计与分析中似乎有总结哪些结构含有reserve,看一下) - 注意vector的size是无符号的。例如
vector<int> aa;
,当aa.size()
为0时,aa.size()-1
不是-1而是一个无符号数的最大值。在所以建议以后i<aa.size()-1写为i+1<aa.size() - C++中,有符号类型数向右位移有点特殊,向右位移时,最左边补0还是补1好像得看机器具体实现。若总是补0则称为
logical shift
,若补符号位
则称为arithmetic shift
,目前C++的编译器似乎都是补符号位(即arithmetic shift
),例如10000000 >> 1
结果为11000000
。除了这种特殊情况,其他时候位移空缺的位都补0。(leetcode的C++编译器不能对负数右移,不知道为啥,如-1>>1在运行时会报错,参考这里也报错,要把这个弄清楚,否则后序在线笔试时提交代码可能会出错) - C++中,有符号数和无符号数在一起进行运算时,首先会将有符号数按照其补码转换为无符号数,再进行运算。(其实可以这么看,机器不认有无符号,全都按照补码来进行计算,最后的结果是补码,按照无符号数的方式解读。)例:
结果是"a>b",因为a的补码是全1,被当成无符号数后为65535,那自然大于b。short a = -1; unsigned b = 1; if(a < b) printf("a<b"); else printf("a>b");
- C++变量未初始化的后果。未初始化的全局变量会自动初始化为0,未初始化的局部变量一般为乱码。参考这里。当然我觉得具体情况还得看编译器吧。
C++ 库函数
int isalnum ( int c )
:头文件\<ctype\>
,检查一个字符是不是字母或数字(alphanumeric)。int tolower(int c);
:头文件\<ctype\>
,将一个字符转换为小写字符。