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

序:
今天作一道題,因爲遞歸函數比較噁心,若是用記憶化搜索,數據範圍極大卻又用不全(二維數組存的話直接炸)。因此決定乾脆使用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遞歸

相關文章
相關標籤/搜索