https://codeforces.com/blog/entry/124683
个人认为不是很使用,仅作为开拓视野(🧐原来还可以这样)。
众所周知,在Python中存在@cache
这个装饰器,从而可以非常方便的写一些递归式的DP。
1 | from functools import cache |
下面在C++中实现类似的功能。
use_cache
的第一个模板参数Signature
是函数签名,第二个模板参数Lambda
则是被包装的lambda函数,它返回一个仿函数Cache
,其成员包括该lambda函数f
,以及用于记忆化的哈希表memo
。所有f
的参数会打包成一个tuple作为memo
的key,而f
的返回值则作为memo
的value。
显然所有参数都是值拷贝的,要使用引用,需要用std::reference_wrapper
进行包裹。
1 | template <typename Signature, typename Lambda> |
为了支持较多的参数类型,如tuple
、container
等,需要手写hash。下面是一个很不错的示例,其实关键就是写一个好的hash_combine
函数(显然异或是不好的)。
1 | namespace hashing { |
最后,众所周知std::unordered_map
的访存很差,性能不好,所以作者选择了gp_hash_table
,并提供了一些用户友好的alias。
1 |
|
使用方式如下:
1 | auto factorial = use_cache<int(int)>([](auto&& self, int n) -> int { |