Строка:
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;
}
};