Сортировка списка с использованием функции сортировки STL - PullRequest
22 голосов
/ 12 марта 2010

Я пытаюсь отсортировать список (часть класса) в порядке убывания, содержащий элементы struct, но он не компилируется:

ошибка: нет совпадения для 'operator-' в '__last - __first'

sort(Result.poly.begin(), Result.poly.end(), SortDescending());

А вот и SortDescending:

struct SortDescending
{
    bool operator()(const term& t1, const term& t2)
    { 
        return t2.pow < t1.pow; 
    }
};

Может кто-нибудь сказать мне, что не так?

Ответы [ 3 ]

36 голосов
/ 12 марта 2010

Стандартный алгоритм std::sort требует итераторов произвольного доступа, которых std::list<>::iterator s нет (итераторы списка являются двунаправленными итераторами).

Вы должны использовать функцию-член std::list<>::sort.

11 голосов
/ 12 марта 2010

std::list имеет встроенный метод sort, который необходимо использовать, поскольку std::sort работает только с итераторами с произвольным доступом, тогда как std::list::iterator просто принадлежит к классу итераторов двунаправленных итераторов.

Result.poly.sort(SortDescending());

Кроме того, ваш operator () должен быть отмечен const.

struct SortDescending
{
    bool operator()(const term& t1, const term& t2) const
    { 
        return t2.pow < t1.pow; 
    }
};

Наконец, для этого вам не нужно писать собственный компаратор, просто используйте std::greater<T> (находится в стандартном заголовке <functional>):

Result.poly.sort(std::greater<term>());
4 голосов
/ 12 марта 2010

Кажется, что типы итераторов для Result.poly отсутствуют operator -. std::sort не работает с std::list изменить на Result.poly.sort

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