Создание компаратора для std::list::sort с++

251
03 октября 2017, 05:56

У меня задание написать Отсортировать числовую последовательность в порядке возрастания количества делителей её элементов, используя двусвязный список Я решил использовать std::list Для сортировки листа std::sort не годится, а вот std::list::sort - самое то Есть функция определения кол-ва делителей для числа

int DoubleList::CountDividers(int num)
{
    int countNum = 0;
    for (int i = 1; i < num; i++)
        if (num % i == 0)
            countNum++;
    return countNum + 1;
}

Есть компаратор. По идее туда нужно передавать итератор и по нему получать уже число в листе, так как функция сортировки сама организует итерации

bool DoubleList::ComparingDividers(const std::list<int>::iterator &num1, const std::list<int>::iterator &num2)
{
    return (CountDividers(*num1) < CountDividers(*num2));
}

Дальше я пытаюсь поместить компаратор в функцию сортировки

void DoubleList::Sorting1()
{
    myList.sort(ComparingDividers);
}

Программа экстренно завершается Может кто знает в чём проблема и как правильно здесь организовать компаратор?

Answer 1

Вот как описывается компаратор:

bool cmp(const Type1 &a, const Type2 &b);

Т.е. он сравнивает не итераторы, а сами значения:

bool DoubleList::ComparingDividers(const int &num1, const int &num2)
{
    return (CountDividers(num1) < CountDividers(num2));
}

Попробуйте так...

Update
Я бы ваше задание решал так (алгоритм поиска числа делителей оставил ваш):

#include <list>
#include <iostream>
using namespace std;
class Num
{
public:
    Num(int n = 0):n(n)
    {
        d = 0;
        // метод ужасный, но вопрос не в нем...
        for (int i = 1; i < n; i++)
            if (n % i == 0) ++d;
    }
    int value()    const { return n; }
    int dividers() const { return d; }
private:
    int n, d;
};
bool lessD(const Num& a, const Num& b)
{
    return a.dividers() < b.dividers();
}

int main(int argc, const char * argv[])
{
    list<Num> l;
    for(int i = 0; i < 20; ++i)
        l.push_back(20+rand()%200);
    for(auto x: l) cout << x.value() << " ";
    cout << endl;
    l.sort(lessD);
    for(auto x: l) cout << x.value() << "(" << x.dividers() <<") ";
    cout << endl;
}
READ ALSO
jquery вытащить id из ссылки

jquery вытащить id из ссылки

Как можно выдернуть id в моем случаи 4681?

285
Как убрать все символы после .html?

Как убрать все символы после .html?

Убрать всё в запросе после ***html через htaccess В этой теме есть код, он оставляет вопросительный знак и символы после него

400