C++:STL 映射,插入新值不起作用

C++: STL map, inserting new value doesn't work

本文关键字:插入 新值 不起作用 映射 STL C++      更新时间:2023-10-16

我正在尝试使用 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;
}

因此,当您执行代码时,不会显示新插入的值。实际上,如果您尝试更新旧的,那也不起作用。谁能让我知道出了什么问题。为什么会这样?

小于比较必须实现严格的弱排序。这是一个要求,没有它,地图将无法工作。您的小于运算符不尊重这一点。

这是一个可行的比较示例:

#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__因为它是一个保留名称。