2

STL C++ を使用してマップを作成しようとしています。しかし、私は問題に直面しており、正確に何が間違っているのかを理解できません。

デモンストレーションのために、ここにコードを書きます。

#include <map>
#include <iostream>
using namespace::std;

struct COORD{

    int X;
    int Y;

    bool operator<(const COORD &other) const { return X == other.X && Y == other.Y;}

    COORD(int x, int y) {
        X = x;
        Y = y;
    }
 };

struct CAR{

    double speed;
    double model;
    double direc;
    CAR() {}
    CAR(double c1, double c2, double c3) {
            speed = c1;
            model = c2;
            direc = c3;
    }
};

int main(int argc, char **argv) {

    map <COORD, CAR> p;
    p.insert(pair<COORD, CAR>(COORD(20, 20), CAR(10.0, 10.0, 10.0)));
    p.insert(pair<COORD, CAR>(COORD(20, 30), CAR(20.0, 10.0, 10.0)));

    CAR c1 = p.at(COORD(20, 30));
    cout << c1.speed << "\n";

    return 0;
}

したがって、コードを実行すると、新しく挿入された値は表示されません。実際、古いものを更新しようとすると、それも機能しません。誰が何が悪いのか教えてもらえますか。なぜこれが起こっているのですか?

4

1 に答える 1

14

小なり比較は厳密な弱い順序付けを実装する必要があります。これは要件であり、これがないとマップは機能しません。あなたの小なり演算子はそれを尊重しません。

これはうまくいく比較の例です:

#include <tuple> // for std::tie

bool operator<(const COORD &other) const 
{
  return std::tie(X, Y) < std::tie(other.X, other.Y);
}

ここで、std::tie比較はX最初に、次にを使用して辞書式に行われYます。COORDは予約名であるため、クラスの名前も変更しました__COORD__

于 2013-10-29T13:06:22.863 に答える