У меня задание написать Отсортировать числовую последовательность в порядке возрастания количества делителей её элементов, используя двусвязный список Я решил использовать 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);
}
Программа экстренно завершается Может кто знает в чём проблема и как правильно здесь организовать компаратор?
Вот как описывается компаратор:
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;
}
Убрать всё в запросе после ***html через htaccess В этой теме есть код, он оставляет вопросительный знак и символы после него