算法第一章作业
一:代码规范
参考 :https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/headers/#
1 . 头文件
1.1. Self-contained 头文件
头文件应该能够自给自足(self-contained,也就是可以作为第一个头文件被引入),以 .h
结尾。至于用来插入文本的文件,说到底它们并不是头文件,所以应以 .inc
结尾。不允许分离出 -inl.h
头文件的做法.
1.2. #define 保护
所有头文件都应该使用 #define
来防止头文件被多重包含, 命名格式当是: <PROJECT>_<PATH>_<FILE>_H_
.
1.3. 前置声明
尽可能地避免使用前置声明。使用 #include
包含需要的头文件即可。
1.4. 内联函数
只有当函数只有 10 行甚至更少时才将其定义为内联函数.
1.5. #include 的路径及顺序
使用标准的头文件包含顺序可增强可读性, 避免隐藏依赖: 相关头文件, C 库, C++ 库, 其他库的 .h, 本项目内的 .h.
2 . 作用域
2.1. 命名空间
鼓励在 .cc
文件内使用匿名命名空间或 static
声明. 使用具名的命名空间时, 其名称可基于项目名或相对路径. 禁止使用 using 指示(using-directive)。禁止使用内联命名空间(inline namespace)。
2.2. 匿名命名空间和静态变量
在 .cc
文件中定义一个不需要被外部引用的变量时,可以将它们放在匿名命名空间或声明为 static
。但是不要在 .h
文件中这么做。
2.3. 非成员函数、静态成员函数和全局函数
使用静态成员函数或命名空间内的非成员函数, 尽量不要用裸的全局函数. 将一系列函数直接置于命名空间中,不要用类的静态方法模拟出命名空间的效果,类的静态方法应当和类的实例或静态数据紧密相关.
2.4. 局部变量
将函数变量尽可能置于最小作用域内, 并在变量声明时进行初始化.
2.5. 静态和全局变量
禁止定义静态储存周期非POD变量,禁止使用含有副作用的函数初始化POD全局变量,因为多编译单元中的静态变量执行时的构造和析构顺序是未明确的,这将导致代码的不可移植。
3.类
3.1. 构造函数的职责
不要在构造函数中调用虚函数, 也不要在无法报出错误时进行可能失败的初始化.
3.2. 隐式类型转换
不要定义隐式类型转换. 对于转换运算符和单参数构造函数, 请使用 explicit
关键字.
3.3. 可拷贝类型和可移动类型
如果你的类型需要, 就让它们支持拷贝 / 移动. 否则, 就把隐式产生的拷贝和移动函数禁用.
3.4. 结构体 VS. 类
仅当只有数据成员时使用 struct
, 其它一概使用 class
.
3.5. 继承
使用组合 (YuleFox 注: 这一点也是 GoF 在 <<Design Patterns>> 里反复强调的) 常常比使用继承更合理. 如果使用继承的话, 定义为 public
继承.
4.格式
4.1. 行长度
每一行代码字符数不超过 80.
4.2. 条件语句
倾向于不在圆括号内使用空格. 关键字 if
和 else
另起一行.
举例:if (condition) {
4.3. 布尔表达式
如果一个布尔表达式超过标准行宽, 断行方式要统一 一下.
如:if (..... &&
..... &&
.....) {
....
}
4.4. 函数声明与定义
注意以下几点:
- 使用好的参数名.
- 只有在参数未被使用或者其用途非常明显时, 才能省略参数名.
- 如果返回类型和函数名在一行放不下, 分行.
- 如果返回类型与函数声明或定义分行了, 不要缩进.
- 左圆括号总是和函数名在同一行.
- 函数名和左圆括号间永远没有空格.
- 圆括号与参数间没有空格.
- 左大括号总在最后一个参数同一行的末尾处, 不另起新行.
- 右大括号总是单独位于函数最后一行, 或者与左大括号同一行.
- 右圆括号和左大括号间总是有一个空格.
- 所有形参应尽可能对齐.
- 缺省缩进为 2 个空格.
- 换行后的参数保持 4 个空格的缩进.
5. 注释
5.1. 类注释
每个类的定义都要附带一份注释, 描述类的功能和用法, 除非它的功能相当明显.
5.2. 实现注释
对于代码中巧妙的, 晦涩的, 有趣的, 重要的地方加以注释.
二、《数学之美系列十三 — 信息指纹及其应用》 读后感
任何一段信息文字,都可以对应一个不太长的随机数,作为区别它和其他信息的指纹。这种映射真是太美妙了,把一个一百多个字符的网址随机地映射到128二进制位的正数中,这样子处理后就可以把存储网址的内存需求量从原来的一百多个字节转变成16个字节,而这种产生随机数的算法,是其中的核心。数学的加减乘除,只要按照一定的规则处理,就可以形成一种好的映射,让信息指纹不可逆,更好地保障了用户的安全。学好数学,灵活运用数学规律,可以帮助我们更好地解决现实中的问题。