序:
今天作一道題,因爲遞歸函數比較噁心,若是用記憶化搜索,數據範圍極大卻又用不全(二維數組存的話直接炸)。因此決定乾脆使用stl::map存儲(反正有O2優化),可是執行insert的時候,編譯器卻莫名其妙的報錯,跳到stl的某個庫之中。一臉懵逼,弄了半天才搞明白緣由。數組
結構體像這樣:less
struct qi{ int x, y; qi(){} qi(int a, int b): x(a), y(b){} }; map<qi, long long> kongse;
插入語句是這樣的:函數
if(a > b) kongse.insert(map<qi, long long>::value_type(m, f(a-b,b+b)+1)); else kongse.insert(map<qi, long long>::value_type(m, f(a+a,b-a)+1));
編譯器報錯了,跳到了這裏:優化
/// One of the @link comparison_functors comparison functors@endlink. template<typename _Tp> struct less : public binary_function<_Tp, _Tp, bool> { bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; } };
這是一個名爲「stl_function.h"的庫,看來是專門實現各類函數的庫。
仔細看這裏:code
{ return __x < __y; }
它返回了一個bool類型的值,是經過 '<'實現的。看到這裏問題應該就很清楚了:咱們的結構體根本就沒有定義<,如何可以比較?
再回想map是什麼,紅黑樹,是實現內部排序的容器,這也就不足爲怪了。
因此解決方法很簡單,隨意定義一個bool operator < (const & ..) const便可。
如:排序
bool operator < (const qi &a)const { return x < a.x; }
如此問題就解決了。
箜瑟_qi 2017.05.07 19:37遞歸