将矢量填充到地图中

时间:2012-05-10 18:54:28

标签: c++ stl map

我正在尝试使用Points矢量填充Point地图。我试图制作棋盘游戏,棋盘上的每个位置都有一个点(x,y)和合法移动的矢量(Point对象)。

我似乎无法将地图KEY作为一个点。

struct Point
{
    Point() {}
    Point(int ix, int iy ) :x(ix), y(iy) {}

    int x;
    int y;
};


Point p_source (2,2);
Point p_next1 (1,2);
Point p_next2 (1,3);
Point p_next3 (1,4);

map <Point, vector<Point> > m_point;

dict[p_source].push_back(p_next1);
dict[p_source].push_back(p_next2);
dict[p_source].push_back(p_next3);

这是我得到的错误

  

在成员函数'bool std :: less&lt; _Tp&gt; :: operator()(const _Tp&amp;,const)中   _Tp&amp;)const [with _Tp = Point]':|

     

从'_Tp&amp; std :: map&lt; _Key,_Tp,_Compare,   _Alloc&gt; :: operator [](const _Key&amp;)[with _Key = Point,_Tp = std :: vector,   std :: allocator&gt;,std :: allocator,std :: allocator&gt; &GT; &gt;,_比较=   std :: less,_Alloc = std :: allocator,   std :: allocator&gt;,std :: allocator,|

     

从这里实例化|

     

c:\ program files('__ x&lt; __y'|||中的'运算符&lt;'不匹配===   构建完成:1个错误,0个警告=== |

2 个答案:

答案 0 :(得分:15)

查看我最喜欢的在线参考it reads

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class map;
     

Map是一个关联容器,包含唯一的排序列表   键值对。 使用比较功能对该列表进行排序   Compare已应用于密钥。搜索,删除和插入操作   具有对数复杂性。地图通常实现为红黑色   树。

由于您未提供明确的Compare,因此使用默认std::less<Key>进行排序。好像我们走在正确的轨道上,因为错误发生在那个班级:

  

在成员函数'bool std :: less&lt; _Tp&gt; :: operator()(const _Tp&amp;,const)中   _Tp&amp;)const [with _Tp = Point]':|

我们check that

template< class T >
struct less;
     

用于执行比较的函数对象。在operator<类型上使用T

这与错误消息告诉我们的内容相符:

  

与'operator&lt;'不匹配在'__x&lt; __y'

嗯,但类型operator< ...

没有Point

答案 1 :(得分:8)

您的错误与std::vector<>完全无关 - std::map<> 要求其密钥与operator<相当,或者您提供自定义比较器。最简单的解决方案是在Point定义后添加以下内容:

bool operator <(Point const& lhs, Point const& rhs)
{
    return lhs.y < rhs.y || lhs.y == rhs.y && lhs.x < rhs.x;
}