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

The requirement for associative containers, which std::map is one of, is that there must be an ordering between the elements used as keys. By default, this is std::less which simply calls operator <. So all you need to do to use your struct as a key in a std::map is implement operator < for it.

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

(ある種の2D構造ではなく)のpositionような1次元構造が実際に必要であると仮定すると、C++11では次のように実行できます。std::map

#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

You need to overload the '<' comparison operator in order for map to (among other things) insert a new element.

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

于 2012-06-05T22:18:04.570 に答える