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

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

Восстановить пароль Регистрация
 
slerden
1 / 1 / 0
Регистрация: 14.10.2015
Сообщений: 14
17.06.2016, 20:19     Priority_queue и ошибка сортировки #1
Привет, ребят Должна получиться программа, которая формирует очередь по половому и возрастному признаку (вперед идут женщины и старики, потом молодые и мужики) Программа завершается с ошибкой во время выполнения (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 и ошибка сортировки
Посмотрите здесь:

Алгоритм сортировки,ошибка! C++
C++ priority_queue< int , char*, CompareHeap1 > pqMax (создать очередь с приоритетом для поиска 10 наиболее и наименее часто встречающихся слов) C++
Использование priority_queue со своим классом C++
C++ Priority_queue
C++ Как задать приоритет priority_queue?
Найти элемент в контейнере priority_queue, используя STL вские итераторы и алгоритмы C++
Сортировки (ошибка в Shell) C++
C++ Возможна ли реализация max_element и remove_if с использованием priority_queue?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vort_
 Аватар для 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
Сообщений: 14
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;
}
Yandex
Объявления
18.06.2016, 19:25     Priority_queue и ошибка сортировки
Ответ Создать тему
Опции темы

Текущее время: 17:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru