Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
slerden
1 / 1 / 1
Регистрация: 14.10.2015
Сообщений: 15
#1

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

17.06.2016, 20:19. Просмотров 329. Ответов 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;
}

http://www.cyberforum.ru/cpp-beginners/thread1269244.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2016, 20:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Priority_queue и ошибка сортировки (C++):

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

Использование priority_queue со своим классом
Если в классе перегрузить оператор '&gt;', то можно использовать такую...

Интересное применение очереди с приоритетом (priority_queue)
Здравствуйте, уважаемые пользователи данного форума! Изучая деки, стеки и...

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

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

2
Vort_
190 / 190 / 78
Регистрация: 10.07.2012
Сообщений: 400
18.06.2016, 08:06 #2
Реализованный оператор не может определиться, кто будет первым: CPerson(48, true) или CPerson(68, false).
По его мнению, 48-летнюю женщину надо пропустить потому, что она женщина, а 68-летнего старика потому, что он старик.
Из-за этого программа и не работает.
1
slerden
1 / 1 / 1
Регистрация: 14.10.2015
Сообщений: 15
18.06.2016, 19:25  [ТС] #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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2016, 19:25
Привет! Вот еще темы с решениями:

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

Ошибка в алгоритме сортировки
Пожалуйста укажите мне ошибку в реализуемом мною алгоритме сортировки ...

Алгоритм сортировки,ошибка!
У меня алгоритм сортировки вставками но вот только не сортирует почему то ...

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


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

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

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