C++ 奇异的递归模板 CRTP

CRTP (The Curiously Recurring Template Pattern) 是 C++ 模板中的一种习惯用法:子类继承时将自己作为基类的模板参数。

一般形式:

1
2
3
4
5
6
7
8
template <typename T>
class Base {

};

class Derived: public Base<Derived> {

};

这样就能在基类访问子类的成员变量及函数。

并查集的概念及实现

动态连通性问题

“连通” 是一种等价关系,两个对象 p 和 q 是相连通的,意味着它具有:

  • 自反性:p 和 p 是相连的
  • 对称性:如果 p 和 q 是相连的,那么 q 和 p 也是相连的
  • 传递性:如果 p 和 q 相连且 q 和 r 相连,那么 p 和 r 也是相连的

等价关系将对象分为多个等价类,在这个,当且仅当两个对象相连通时才属于同一个等价类。

动态规划之背包问题

0-1 背包

给你一个可装载重量为 W 的背包和 N 个物品,每个物品有重量和价值两个属性。其中第 i 个物品的重量为 wt[i],价值为 val[i],现在让你用这个背包装物品,最多能装的价值是多少?

读《C++ API 设计》总结

优秀 API 的特征

问题域建模

API 应该对它所解决的问题提供良好的逻辑抽象。当把 API 文档提供给用户时,他应该能够理解接口中的概念并且知道它的工作机制。

API 应该对问题域的关键对象建模,即面向对象设计。一般使用 UML 类图或对象图表示对象模型。

隐藏实现细节

API 应该隐藏所有的实现细节,避免修改 API 对已有的客户造成影响。

C++ 中的自动类型推导

模板参数推导

函数模板类型推导

简单的函数模板:

1
2
template <typename T>
void f(ParamType param);

调用时:

1
f(expr);

在编译期间,编译器会推导两个类型:一个是 T ,另一个是 ParamType ,比如:

1
2
3
4
5
6
template <typename T>
void f(const T& param);

// 调用
int x = 0;
f(x);

T 推导为 int ,ParamType 推导为 const inst& ,T 的推导不仅取决于 expr 的类型,还取决于 ParamType 的类型。