0 / 0 / 0
Регистрация: 15.08.2017
Сообщений: 25
1

Сортировка std::list с функцией sort()

01.10.2017, 09:15. Показов 10190. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня задание написать
Отсортировать числовую последовательность в порядке возрастания количества делителей её элементов, используя двусвязный список
Я решил использовать std::list

Есть функция, подсчитывающая кол-во делителей каждого элемента

C++
1
2
3
4
5
6
7
8
    int DoubleList::CountDividers(int num)
    {
        int countNum = 0;
        for (int i = 1; i < num; i++)
            if (num % i == 0)
                countNum++;
        return countNum + 1;
    }
Есть функция для сортировки
C++
1
2
3
4
    bool DoubleList::ComparingDividers(std::list<int>::iterator it1, std::list<int>::iterator it2)
    {
        return (CountDividers(*it1) < CountDividers(*it1));
    }
На неё выходит ошибка:
Ошибка C3867 "Program:ubleList::ComparingDividers": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
Пытаюсь вызывать сортировку по функции
C++
1
2
3
4
    void DoubleList::Sorting1()
    {
        myList.sort(ComparingDividers);
    }
Компилятор говорит, что используется всего один аргумент
Кто-нибудь может подсказать как правильно пишется собственная сортировка, пытался через std::sort, но там тоже поражение
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2017, 09:15
Ответы с готовыми решениями:

Сортировка массива c++ std :: sort()
Дан двумерный массив символов char M, надо отсортировать его при помощи std :: sort(), построчно,...

Сортировка вектора через std::sort
Доброго времени суток, интересует сабж void Sort(list&lt;int&gt; &amp;past) { sort(past.begin(),...

Сортировка индексов алгоритмом std::sort
Есть два массива одинаковой размерности. В одном хоть что, во втором целые числа (индексы элементов...

Std::sort сортировка вектора объектов
Добрый день. Пытаюсь выполнить сортировку вектора объектов с помощью функции сравнения ...

8
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
01.10.2017, 09:50 2
C++
1
2
3
4
bool DoubleList::ComparingDividers(int num1, int num2)
{
    return (CountDividers(num1) < CountDividers(num2));
}
0
0 / 0 / 0
Регистрация: 15.08.2017
Сообщений: 25
01.10.2017, 09:57  [ТС] 3
retmas, У меня же список, тут только по итераторам обращаться к элементам
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
01.10.2017, 10:02 4
adLer21, читайте документацию лучше, и увидите что передается в функцию сравнения
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
01.10.2017, 10:31 5
adLer21,
Вынесите функции ComparingDividers и CountDividers из класса. Сделайте их свободными:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int CountDividers(int num)
{
    int countNum = 0;
    for (int i = 1; i < num; i++)
        if (num % i == 0)
            countNum++;
    return countNum + 1;
}
 
bool ComparingDividers(const int &first, const int &second)
{
    return (CountDividers(first) < CountDividers(second));
}
 
class DoubleList
{
   //...
};
0
0 / 0 / 0
Регистрация: 15.08.2017
Сообщений: 25
01.10.2017, 10:40  [ТС] 6
Даценд, Вы можете подсказать мне как сделать функцию сравнения для сортировки
Я сейчас попытаюсь объяснить
Здесь пытаюсь сделать функцию сравнения соседних элементов в списке по их количеству делителей, чтобы потом "пихнуть" её в сорт
C++
1
2
3
4
5
6
7
    bool DoubleList::Temp (std::list<int>::iterator it) 
    {
        if (CountDividers(*it) < CountDividers(*std::next(it)))
            return true;
        else if (*it > *std::next(it))
            return false;
    }
C++
1
2
3
4
    void DoubleList::Sorting1()
    {
        myList.sort("Temp(какой-то итератор наверное)");
    }
И по моей логике функция sort переходит сама по следующему итератору и сортирует
Мне не хватает знаний как это организовать правильно
Перетаскивание функций думаю здесь не играет роли, это всё тесты, потом отшлифую
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
01.10.2017, 11:23 7
Цитата Сообщение от adLer21 Посмотреть сообщение
функция sort переходит сама по следующему итератору и сортирует
Если это функция листа, то она организует итерации сама, т.е. ей итераторы передавать не нужно. Нужно передавать компаратор. Компаратор принимает 2 аргумента, сравнивает их по какому-либо критерию (в вашем случае по количеству делителей) и возвращает значение типа bool. И компаратор и функция определения количества делителей должны быть либо свободными, либо static в глобальной области класса.
Цитата Сообщение от adLer21 Посмотреть сообщение
Перетаскивание функций думаю здесь не играет роли
Играет.
1-й вариант в моем предыдущем сообщении
2-й вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class DoubleList
{
private:
      //...
public:
      //...
        void Sorting1();
    static int CountDividers(int num)
    {
        int countNum = 0;
        for (int i = 1; i < num; i++)
            if (num % i == 0)
                countNum++;
        return countNum + 1;
    }
 
    static bool ComparingDividers(const int &i1, const int &i2)
    {
        return (CountDividers(i1) < CountDividers(i2));
    }
      //...
 
};
 
void DoubleList::Sorting1()
{
    myList.sort(ComparingDividers);
}
Затем можно сортировать так:
C++
1
2
3
4
5
6
7
int main()
{
    DoubleList dl;
    // заполнение
    dl.Sorting1();
        //...
}
0
0 / 0 / 0
Регистрация: 15.08.2017
Сообщений: 25
01.10.2017, 11:24  [ТС] 8
Даценд, Благодарю
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
01.10.2017, 11:26 9
Цитата Сообщение от adLer21 Посмотреть сообщение
как сделать функцию сравнения для сортировки
adLer21, см. пример на странице std::list::sort
0
01.10.2017, 11:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2017, 11:26
Помогаю со студенческими работами здесь

Сортировка списка с использованием std::sort
Что-то не получается отсортировать целочисленные данные расположенные в списке, компилятор (VS10)...

Сортировка массива объектов функцией sort
Не получается отсортировать массив объектов. После сортировки должен вывестись список...

Сортировка vectora обьектов функцией sort из algorithm
помогите написать предикат CompareStudent к функции sort нужно чтобы вначале сортировало по...

Сортировка объектов функцией sort() по данным объекта
Есть класс Man, при создании его объекта в вектор &quot;люди&quot; должно заносить этот объект. После вызова...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru