map中結構體做關鍵字的注意事項
阿新 • • 發佈:2019-02-20
序:
今天做一道題,由於遞迴函式比較噁心,如果用記憶化搜尋,資料範圍極大卻又用不全(二維陣列存的話直接炸)。所以決定乾脆使用stl::map儲存(反正有O2優化),但是執行insert的時候,編譯器卻莫名其妙的報錯,跳到stl的某個庫之中。一臉懵逼,弄了半天才搞明白原因。
結構體像這樣:
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“的庫,看來是專門實現各種函式的庫。
仔細看這裡:
{ 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