C ++ std :: set компаратор - PullRequest
2 голосов
/ 30 июня 2009

Это код:

struct comp
{
    bool operator()(Reputation *one, Reputation *two)
    {
        if (one->Amount < 0 && two->Amount >= 0)
            return false;
        if (one->Amount >= 0 && two->Amount < 0)
            return true;

        if (one->Amount >= 0)
            return one->Amount <= two->Amount;
        else
            return one->Amount >= two->Amount;
    }
};

И это проблема:

Ошибка отладочного подтверждения!
Файл: .. \ VC \ include \ xtree
Линия: 638

Выражение: недопустимый оператор <</p>

После этого я могу выбрать «Прервать», «Повторить» или «Пропустить». Если я решу игнорировать, появится много других (идентичных), но в итоге все заработает отлично.

Кажется, проблема возникает, когда я вставляю Репутацию с -> Amount == в одну из ранее вставленных Репутаций *, но я не уверен насчет последней.

Любая помощь будет принята с благодарностью

РЕДАКТИРОВАТЬ: порядок, в котором я хочу их упорядочить, это сначала положительные в порядке asc, затем отрицательные в порядке desc. Пример: 1 5 10 11 11 20 50 -1 -5 -50

Ответы [ 3 ]

6 голосов
/ 30 июня 2009

Вы должны определить отношение, которое нерефлексивно , точно так же, как < - поэтому замените <= на < и '> =' на '>' в последней паре Сравнения в вашем методе. Это то, что VC ++ диагностирует.

Кроме того, при правильно закодированном, <- подобном операторе, если два элемента a и b таковы, что a

1 голос
/ 30 июня 2009

Предметы в std::set должны быть уникальными! (и менее сопоставимый) Если вы хотите, чтобы несколько элементов имели одинаковое значение (например, предоставленный вами образец), используйте std::multiset.

см .: http://www.cppreference.com/wiki/stl/set/start и http://www.cppreference.com/wiki/stl/multiset/start

0 голосов
/ 30 июня 2009

Вы не можете вставлять одинаковые значения в std :: set, для этого требуются уникальные значения. Используйте std :: multiset.

Для вашего забавного заказа это работает:

struct comp
{
    bool operator()(const Reputation *a, const Reputation *b)
    {
        if (a->Amount < 0 && b->Amount < 0)
            return a->Amount > b->Amount;
        else if (a->Amount < 0) return false;
        else if (b->Amount < 0) return true;
        else return a->Amount < b->Amount;
    }
};
...