1. 程式人生 > >map中結構體做關鍵字的注意事項

map中結構體做關鍵字的注意事項

序:
今天做一道題,由於遞迴函式比較噁心,如果用記憶化搜尋,資料範圍極大卻又用不全(二維陣列存的話直接炸)。所以決定乾脆使用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