我试过写这段代码:
#include <iostream>
#include <map>
using namespace std;
typedef struct
{
int x;
int y;
}position;
int main(int argc, char** argv)
{
map<position, string> global_map;
position pos;
pos.x=5;
pos.y=10;
global_map[pos]="home";
return 0;
}
事实上,这不是原始代码,而是简化了它的版本(我正在尝试用OpenGL制作俄罗斯方块游戏)。
无论如何,问题是我说的行上的语法错误:“global_map [pos] =”home“;”。
我没有得到错误的原因,我在这里发布了谁需要更多细节:
invalid operands to binary expression (' position const' and 'position const')
答案 0 :(得分:6)
关联容器的要求,std::map
是其中之一,是必须在用作键的元素之间进行排序。默认情况下,std::less
只调用operator <
。因此,要将struct
用作std::map
中的关键字,您需要做的就是实现operator <
。
struct position
{
int x;
int y;
};
bool operator <( position const& left, position const& right )
{
return left.x < right.x || ( left.x == right.x && left.y < right.y );
}
答案 1 :(得分:2)
假设你真的想要position
在一维结构中,例如std::map
(而不是某种2D结构),你可以在C ++ 11中这样做:
#include <iostream>
#include <map>
using namespace std;
typedef struct
{
int x;
int y;
}position;
int main(int argc, char** argv)
{
auto cmp = [](const position& a, const position& b) -> bool {
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
};
map<position, string, decltype(cmp)> global_map(cmp);
position pos;
pos.x=5;
pos.y=10;
global_map[pos]="home";
return 0;
}
请根据自己的喜好调整cmp
。
答案 2 :(得分:1)
你需要重载'&lt;'比较运算符,以便映射到(除其他外)插入一个新元素。
bool operator<(const position&, const position&);