1

我试图编写这段代码:

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

3 回答 3

6

关联容器的要求是其中std::map之一,即用作键的元素之间必须有顺序。默认情况下,这std::less只是调用operator <. struct因此,在 a 中使用 your作为键所需要做的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 );
}
于 2012-06-05T22:17:55.037 回答
2

假设您实际上想要position一维结构,例如std::map(而不是某种二维结构),您可以在 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根据自己的喜好调整。

于 2012-06-05T22:23:08.810 回答
1

您需要重载“<”比较运算符,以便 map (除其他外)插入新元素。

bool operator<(const position&, const position&);

于 2012-06-05T22:18:04.570 回答