Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
slerden
1 / 1 / 0
Регистрация: 14.10.2015
Сообщений: 15
#1

Priority_queue и ошибка сортировки - C++

17.06.2016, 20:19. Просмотров 222. Ответов 2
Метки нет (Все метки)

Привет, ребят Должна получиться программа, которая формирует очередь по половому и возрастному признаку (вперед идут женщины и старики, потом молодые и мужики) Программа завершается с ошибкой во время выполнения (invalid comparator). При том нужно реализовать такую сортировку именно с помощью бинарного предиката для priority_queue (задание из учебника Сиддхартха Рао c++ in one hour a day).

Код:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// stacks.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <queue>
#include <stack>
#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
 
using namespace std;
 
 
template<typename T = CPerson>
struct OldAndFemales {
    bool operator() (const T& h1, const T& h2) {
        return(((h1.Age < 50) && (h2.Age>50)) || ((!h1.isFemale) && (h2.isFemale)));
    }
 
};
 
 
class CPerson {
public:
    CPerson(int iA, bool iF) :Age(iA), isFemale(iF) { if (isFemale) male = "female"; };
    bool isFemale;
    int Age;
    string male = "male";
};
 
void func2() {
    priority_queue <CPerson, vector<CPerson>, OldAndFemales<>> HumanStack;
    HumanStack.push(CPerson(48, true));
    HumanStack.push(CPerson(68, false));
    HumanStack.push(CPerson(33, false));
    HumanStack.push(CPerson(34, true));
    HumanStack.push(CPerson(28, true));
    HumanStack.push(CPerson(11, false));
    HumanStack.push(CPerson(90, false));
    while (!HumanStack.empty())
    {
        cout << HumanStack.top().Age << " - " << HumanStack.top().male << endl;
        HumanStack.pop();
    }
}
 
int main()
{
    func2();
    _getch();
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2016, 20:19     Priority_queue и ошибка сортировки
Посмотрите здесь:

Priority_queue - C++
У меня есть задача. В файле содержаться строки, в которых указана фамилия и 5 оценок. Программа читает данные и помещает их в объект...

Использование priority_queue со своим классом - C++
Если в классе перегрузить оператор '&gt;', то можно использовать такую конструкцию? priority_queue &lt;Class, vector &lt;Class&gt;, greater &lt;Class&gt;&gt;...

Как задать приоритет priority_queue? - C++
Здравствуйте. Хочу понять как в очереди задавать приоритет. #include &lt;queue&gt; #include &lt;iostream&gt; #include &lt;functional&gt; #include...

Возможна ли реализация max_element и remove_if с использованием priority_queue? - C++
Доброго времени суток. Возник вопрос. возможна ли реализация max_element и remove_if с использованием priority_queue?

Найти элемент в контейнере priority_queue, используя STL вские итераторы и алгоритмы - C++
Здравствуйте, задача описана в навание темы. Можно перебрать в цикле все элементы очереди, сравнивая с нужным, но требуется именно с...

C++ priority_queue< int , char*, CompareHeap1 > pqMax (создать очередь с приоритетом для поиска 10 наиболее и наименее часто встречающихся слов) - C++
Выполняю задачу &quot;Частотный словарь&quot;, необходимо создать очередь с приоритетом для поиска 10 наиболее и наименее часто встречающихся слов. ...

Сортировки (ошибка в Shell) - C++
Здравствуйте. У меня есть задание написать 5 типов сортировок. По сути 4 из них работают и нормально сортируют массив (задание -...

Алгоритм сортировки,ошибка! - C++
У меня алгоритм сортировки вставками но вот только не сортирует почему то #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include...

Ошибка сортировки пузырьком - C++
Программа заполняет массив из 10 элементов рандомными числами от 1 до 100, выводит исходный массив, потом сортирует его методом пузырька и...

Ошибка в алгоритме сортировки - C++
Пожалуйста укажите мне ошибку в реализуемом мною алгоритме сортировки #include &lt;iostream&gt; using namespace std; int main() ...

Ошибка сортировки: Invalid operator< - C++
Почему так работает нормально: #include &quot;iostream&quot; #include &quot;vector&quot; #include &quot;algorithm &quot; #include &quot;iterator&quot; using...

Ошибка в коде сортировки слиянием - C++
Вобщем, я реализовал рекурсивную сортировку слиянием (Merge Sort), но она работает за O(N), а должна за O(N log N), помогите найти ошибку в...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vort_
186 / 186 / 52
Регистрация: 10.07.2012
Сообщений: 400
18.06.2016, 08:06     Priority_queue и ошибка сортировки #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Реализованный оператор не может определиться, кто будет первым: CPerson(48, true) или CPerson(68, false).
По его мнению, 48-летнюю женщину надо пропустить потому, что она женщина, а 68-летнего старика потому, что он старик.
Из-за этого программа и не работает.
slerden
1 / 1 / 0
Регистрация: 14.10.2015
Сообщений: 15
18.06.2016, 19:25  [ТС]     Priority_queue и ошибка сортировки #3
Спасибо большое Переписал реализацию приоритетов, добавив переменные h1P и h2P, как показатели этих самых приоритетов и получилось довольно здорово Если кому-то интересно, то вот код
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// stacks.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <algorithm>
#include <queue>
#include <stack>
#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
 
using namespace std;
 
template<typename T = CPerson>
struct OldAndFemales {
    bool operator() (const T& h1, const T& h2) {
        size_t h1P = 0, h2P = 0;
        if (h1.Age > 50) h1P++;
        if (h2.Age > 50) h2P++;
        if (h1.isFemale)h1P++;
        if (h2.isFemale)h2P++;
        if (h1P < h2P) return true;
        else return false;
    }
 
};
 
 
class CPerson {
public:
    CPerson(int iA, bool iF) :Age(iA), isFemale(iF) { if (isFemale) male = "female"; };
    bool isFemale;
    int Age;
    string male = "male";
    
};
 
void func2() {
    priority_queue <CPerson,deque<CPerson>,OldAndFemales<>> HumanStack;
    HumanStack.push(CPerson(48, true));
    HumanStack.push(CPerson(68, false));
    HumanStack.push(CPerson(33, false));
    HumanStack.push(CPerson(34, true));
    HumanStack.push(CPerson(28, true));
    HumanStack.push(CPerson(11, false));
    HumanStack.push(CPerson(90, false));
    HumanStack.push(CPerson(89, true));
    while (!HumanStack.empty())
    {
        cout << HumanStack.top().Age << " - " << HumanStack.top().male << endl;
        HumanStack.pop();
    }
}
int main()
{
    func2();
    _getch();
    return 0;
}
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru