不能使用结构作为地图的索引

时间:2012-06-05 22:12:27

标签: c++ map

我试过写这段代码:

#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')

3 个答案:

答案 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&);