Неверные операнды в бинарном выражении (константная точка и константная точка - PullRequest
1 голос
/ 10 апреля 2020
    map<pair<int,int>,int>pairOfNumbers;
pairOfNumbers.insert(pair<pair<int,int>,int>({1,2},2));

это работает, но

    map<pair<point,point>,int>PointsOnLine;
PointsOnLine.insert(pair<pair<point,point>,int>(make_pair(points[i],points[j]),count));

это не так.

точка - это просто структура из двух целых чисел x и y; Я продолжаю получать сообщение об ошибке «Неверные операнды в двоичном выражении (const point и const point») это структура точки.

    struct point
{
    int x;
    int y;
public:
    bool operator==(const point& p)
    {
        if(x==p.x && y==p.y)
            return true;
        else
            return false;
    }
    bool operator!=(const point& p)
    {
        if(x==p.x &&y==p.y)
            return false;
        else
            return true;
    }
};

как мне вставить две точки и расстояние между ними на карте? В Xcode Я получаю эту ошибку error message in Xcode

1 Ответ

1 голос
/ 10 апреля 2020

Ваш тип point не поддерживает слабый порядок. У него нет метода определения «меньше». Вы можете подумать, что вам это не нужно, потому что ваш point фактически заправлен в std::pair<point,point>, но вы делаете.

std::pair<T1,T2> поддерживает слабый порядок, только если T1 и T2 делают. В вашем случае они одного типа, поэтому для использования std::pair<point,point> в качестве ключа std::map<std::pair<point,pint>,T>, point должен поддерживать слабый порядок.

Для поддержки слабого порядка вы должны либо предоставьте operator<, который сравнивает два ваших рассматриваемых объекта, или тип функтора компаратора, который делает то же самое. Самый простой способ сделать это:

#include <tuple>

struct point
{
    int x;
    int y;

    bool operator <(const point& p) const
    {
        return std::tie(x, y) < std::tie(p.x, p.y);
    }

    bool operator ==(const point& p) const
    {
        return !(*this < p || p < *this);
    }

    bool operator !=(const point& p) const
    {
        return *this < p || p < *this;
    }
};

Я позволил себе переопределить operator == и operator !=, чтобы использовать свойства слабого порядка соответствующих operator <. В этом не было необходимости, но в конечном итоге просто, если операторы root набирают код c, насколько это возможно. С учетом вышеуказанных изменений вы сможете использовать как point и std::pair<point,point> в качестве типов ключей в std::map и std::set. По правде говоря, строгий слабый порядок может определять все базовых c компараторов (<=,>,> =,! =, ==) как производные от operator < в той или иной форме ( или относительно того, что делает). Я призываю вас рассмотреть их, попробовать реализовать их и, прежде всего, написать несколько тестовых наборов, которые проверяют вашу реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...