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递归

相关文章
相关标签/搜索