Сбой утверждения Visual Studio на компараторе множеств C ++

Мой код имеет некоторые проблемы на моем Visual Studio 2010, но не на DevCPP. Вот ситуация, я использовал C ++ STL set в моем коде, чтобы вставить pair<string, double> но тогда я хочу мой set чтобы отсортировать их, используя значение вместо ключа, поэтому для этого я использовал собственный компаратор.

struct sortPairSecond
{
bool operator()(const pair<string, double> &lhs, const pair<string, double> &rhs)
{
return lhs.second >= rhs.second;
}
};

Код отлично работает в DevCPP, но столкнулся с ошибкой отладочного подтверждения на xtree с использованием VS2010. Я провел некоторую отладку и понял, что ошибка вызвана использованием> = в пользовательском компараторе, что исключает использование кода = make, но неверные результаты, так как в моей программе должно быть разрешено дублирование значения. Поэтому кто-нибудь может мне помочь в этом вопросе?

0

Решение

Ваше использование >= и не > может быть недействительным, потому что это должно быть строгим порядком op(a,b) а также op(b,a) оба не могут быть правдой (но они были бы, если бы они были равны).

Это просто ошибка утверждения, но set не может содержать повторяющиеся значения. Просто используйте отсортированный vector или вы можете использовать multiset (и используйте «>»)

Конечно, поскольку мы знаем, что первые значения уникальны, мы можем расширить предикат, когда второе значение равно для сравнения первого. Это гарантирует вам уникальные ценности, и тогда вы все еще можете использовать std::set,

struct sortPairSecond
{
bool operator()(const pair<string, double> &lhs, const pair<string, double> &rhs) const
{
return (lhs.second > rhs.second) || (lhs.second == rhs.second && lhs.first > rhs.first) ;
}
};

По сути, не пытайтесь «сломать» то, что std::set предназначен для использования при попытке манипулировать вашим предикатом.

7

Другие решения

Других решений пока нет …