Использование настраиваемого объекта в качестве ключа и значения на карте в c ++ - PullRequest
0 голосов
/ 06 августа 2020

Я получаю сообщение об ошибке при использовании карты.

#include <bits/stdc++.h>

using namespace std;

class Vertex
{
  public:
    int x,y;
    Vertex(int x,int y) : x(x), y(y) {} 
}; 

class cmp {
  public:
    bool operator()(const Vertex &a, const Vertex &b)
    {
        return a.x < b.x;
    } 
}; 

int main() {   
    map<Vertex, Vertex, cmp> mp;
    Vertex u(0,0);
    Vertex v(1,2);
    mp[u] = v;//This line gives error
    return 0;
}

что не так с mp [u] = v?

1 Ответ

0 голосов
/ 06 августа 2020

Строка:

mp[u] = v;

Требуется создать пустой (по умолчанию) Vertex и затем присвоить ему v. Проблема в том, что не существует конструктора по умолчанию для Vertex, поэтому начальный пустой экземпляр не может быть создан.

Есть два возможных исправления:

Первое: добавьте конструктор по умолчанию для Vertex:

class Vertex
{
public:
  int x, y;
  Vertex(int x, int y) : x(x), y(y) {}
  Vertex() : x(0), y(0) {}
};

Второй: используйте map::emplace вместо map::operator[] (моя рекомендация):

mp.emplace(u, v);

map::emplace создает сразу всю пару ключа и значения без необходимости создавать временное значение «по умолчанию» для значения карты.

И следующая проблема - ваш оператор сравнения. Он должен быть постоянным (объект компаратора не должен изменяться при каждом сравнении):

class cmp {
public:
  bool operator()(const Vertex &a, const Vertex &b) const
  {
    return a.x < b.x;
  }
};
...