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

Как сделать грамотно вывод очереди в с++

17.12.2022, 18:51. Показов 999. Ответов 2
Метки с++ (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно реализовать вывод по приоритету, всё в принципе понятно. Проблема в том что я не знаю как выводить эту очередь. Не знаю как сделать для вектора оператор вывода.. И так не могу найти статью как работать с векторами классов так тут ещё и очередь..

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
61
62
63
64
65
66
67
68
#include<iostream>
#include<cctype>
#include<string.h>
#include<math.h>
#include <cstring>
#include <vector>
#include<map>
#include<algorithm>
#include <queue>
#include <deque>
using namespace std;
class Monster
{
private:
    string monster;
    int Health;
public:
    Monster(string Monster, int HP) {
        this->monster = Monster;
        this->Health = HP;
    }
    string Get_Monster() { return monster; }
    int Get_Health() { return Health; }
 
    friend ostream& operator<<(ostream& out, Monster& name)
    {
 
        return out << "Monster name: " << name.Get_Monster() << " Monster HP: " << name.Get_Health() << endl;
 
    }
 
};
 
class Battle
{
private:
    queue<Monster>Battle;
    vector<Monster>::iterator iter;
public:
    
 
 
    void AddM(Monster& name)
    {
        Battle.push(name);
    }
    void printMonsters()
    {
 
        while (! Battle.empty())
        {
            cout << Battle.front() << endl;
            cout << Battle.pop(); // Не работает , знаю что нужно сделать перегрузку но вот в этом проблема.
        }
    }
};
int main()
{
    Monster Demon("Demon", 80);
    Monster Ogr("Ogr", 100);
    Monster Skeleton("Demon", 15);
    Battle FirstBattle;
    FirstBattle.AddM(Demon);
    FirstBattle.AddM(Ogr);
    FirstBattle.AddM(Skeleton);
    FirstBattle.printMonsters();
 
}
Помогите ученику умные люди.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2022, 18:51
Ответы с готовыми решениями:

Как грамотно сделать вывод графики в оконном приложении?
Поясните, пожалуйста, как грамотно сделать вывод графики в оконном приложении. Мне надо загружать множество картинок через...

Как сделать вывод элементов массива по очереди
Добрый день такой вопрос. Мне нужно сделать так что бы элементы массива выводились один за другим, вот думал Thread.Sleep но он только в...

Как грамотно сделать псевдоним?
Делаю себе помощника в Excel Вот такие конструкции довольно часто мучают моцк: if...

2
16 / 12 / 4
Регистрация: 01.05.2023
Сообщений: 14
02.05.2023, 11:09 2
std::queue::pop() не возвращает значение:

C++
1
2
3
4
5
6
void printMonsters() {
        while (!Battle.empty()) {
            cout << Battle.front();
            Battle.pop();
        }
    }
Цитата Сообщение от GODLucker Посмотреть сообщение
знаю что нужно сделать перегрузку
Перегрузку сделать не надо, класс queue написан не вами, и изменить его удастся только если создать класс наследник. Не думаю, что это то что вам нужно.

А вот что вам нужно, так это пересмотреть выбор структуры данных. printMonsters() - функция, которая выводит всех монстров, одновременно их всех удаляя. Предположу, что задача стояла просто вывести. Тогда, можно сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//...
#include <forward_list>
 
class Battle {
private:
    forward_list<Monster> Battle;
    //vector<Monster>::iterator iter;
public:
    void AddM(Monster& name) {
        Battle.push_front(name);
    }
    void printMonsters() {
        for (Monster& m: Battle) {
            std::cout << m;
        }
    }
};
//...
Да и вообще, почему бы не перегрузить operator<<, как это было сделано с монстрами выше?

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
#include <iostream>
#include <forward_list>
 
using namespace std;
class Monster {
private:
    string monster;
    int Health;
public:
    Monster(const string& Monster, int HP) {
        this->monster = Monster;
        this->Health = HP;
    }
    string Get_Monster() const { return monster; }
    int Get_Health() const { return Health; }
 
    friend ostream& operator<<(ostream& out, const Monster& name) {
        return out << "Monster name: " << name.Get_Monster() << " Monster HP: " << name.Get_Health() << endl;
    }
 
};
 
class Battle {
private:
    forward_list<Monster> monsters;
 
public:
    void AddM(const Monster& monster) {
        monsters.push_front(monster);
    }
 
    friend ostream& operator<<(ostream& out, const Battle& battle) {
        for (const Monster& m : battle.monsters)
            out << m;
        return out;
    }
};
 
int main() {
    Monster Demon("Demon", 80);
    Monster Ogr("Ogr", 100);
    Monster Skeleton("Demon", 15);
    Battle FirstBattle;
    FirstBattle.AddM(Demon);
    FirstBattle.AddM(Ogr);
    FirstBattle.AddM(Skeleton);
    cout << FirstBattle;
}
С вашего позволения, некоторые рекомендации по дальнейшему написанию кода:
1) методы, не изменяющие сам объект при своём выполнении, лучше обозначать const: int Get_Health() const { ... };
2) передачу структуры выполнять через константную ссылку, если вы не собираетесь менять то, что вам дала вызывающая сторона: friend ostream& operator<<(ostream& out, const Monster& name) (name меняться не будет, поэтому передаём константную ссылку - const TypeName&);
3) поизучайте стандартные STL контейнеры - их много, и каждый из них имеет свои преимущества и недостатки в разных ситуациях: vector, list, forward_list, map, multimap, set и так далее;
4) старайтесь придерживаться единого стиля именования переменных/методов/функций. У вас в Monster есть поле monster с маленькой буквы, и поле Health с заглавной. Так-же, у вас есть метод Get_Monster с разделением в виде нижнего подчёркивания, и AddM без такового. Если у вас нет каких-либо предпочтений в этом вопросе, рекомендую использовать snake_case (все буквы малые, слова разделяются нижним подчёркиванием) для переменных, полей, функций и методов; PascalCase для имён типов (классы, using) и SCREAM_CASE для директив #define

Цитата Сообщение от GODLucker Посмотреть сообщение
реализовать вывод по приоритету, всё в принципе понятно
это, как раз таки, не понятно. Что за приоритет? Когда был добавлен? Если да, замените в функции Battle::AddM monsters.push_front(monster); на monsters.push_back(monster);
1
1 / 1 / 0
Регистрация: 19.05.2019
Сообщений: 20
02.05.2023, 15:05  [ТС] 3
Больше спасибо за ответ! Я более мене разобрался тогда, но вы дали новую пищу для размышлений. Хорошего дня!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.05.2023, 15:05
Помогаю со студенческими работами здесь

Как грамотно сделать апгрейд?
Версия Windows: Майкрософт Windows 10 Pro Название системы: HP 500-008er Процессор: AMD A6-5400K APU with Radeon(tm) HD Graphics ...

Реализации кода через очереди(Не понимаю как сделать код через очереди)
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iomanip&gt; #include &lt;algorithm&gt; using namespace std; void table() { cout...

Объясните как грамотно сделать цикл
Здравствуйте, есть макрос с функцией, добавляющий свойства из формы: Sub ChangeOrCreateCustomProperties(PropName As String, PropValue...

Как грамотно сделать рамку в дипломе
Подскажите как можно сделать основную надпись, что бы один раз настроил все расстояния её расположения и дальше что бы она была в такой же...

Фоновая картинка - как грамотно сделать?
Здравствуйте. Кто сталкивался, помогите. Если я делаю в шапке фоновую картинку растянутую на весь экран. То при уменьшении размера окна,...


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

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

Новые блоги и статьи
Введение в Dapr для разработчиков .NET
UnmanagedCoder 18.03.2025
Разработка распределенных систем никогда не была настолько востребованной и одновременно такой сложной. Если вы . NET разработчик, то наверняка сталкивались с необходимостью жонглировать обнаружением. . .
Собеседование по Spring Boot: продвинутые вопросы и ответы
Javaican 18.03.2025
Собеседования на позиции старших разработчиков и архитекторов требуют глубокого понимания внутренних механизмов Spring Boot, нюансов конфигурирования, подходов к оптимизации и построению сложных. . .
Перечисления в TypeScript: использование и лучшие практики
run.dev 18.03.2025
Пишете код и устали от разбросанных по проекту "волшебных" строк и чисел? Знакомая ситуация: где-то в глубине кода притаилась строка "ADMIN", а в другом месте используется "admin". И вот уже. . .
Фишки Kotlin, которые все любят
Javaican 18.03.2025
Помню, как скептически относился к появлению "ещё одного языка для JVM" — мол, зачем нам что-то новое, когда есть Java? Но первый же проект на Kotlin заставил меня пересмотреть свое мнение. Код стал. . .
Списки и кортежи в Python: различия, особенности, применение
py-thonny 18.03.2025
Если вы когда-нибудь писали код на Python, то наверняка сталкивались с конструкциями вида или ('имя', 25, 'инженер'). Это и есть списки и кортежи — последовательности, хранящие упорядоченные наборы. . .
Интеграция JavaScript в Haskell
golander 18.03.2025
Ключевая особенность нового JS-бэкенда GHC — возможность создавать колбэки из JavaScript в Haskell-код. Это открывает дорогу разработке полноценных браузерных приложений, позволяя реагировать на. . .
Циклы for в Python
py-thonny 17.03.2025
Существует множество ситуаций, когда нам нужно выполнить одно и то же действие несколько раз. Цикл for в Python — настоящий рабочий конь для большинства программистов. Если вам нужно пройтись по всем. . .
Предсказание ветвлений - путь к высокопроизводи­тельному C++
NullReferenced 17.03.2025
В высокопроизводительном программировании на C++ каждый такт процессора на счету. Когда речь заходит о разработке систем с низкой задержкой — будь то высокочастотная торговля, обработка потоковых. . .
Паттерн CQRS в C#
UnmanagedCoder 17.03.2025
Создание сложных корпоративных приложений часто требует нестандартных подходов к архитектуре. Один из таких подходов — паттерн CQRS (Command Query Responsibility Segregation), предлагающий простую,. . .
Паттерн Цепочка ответственности в C#
UnmanagedCoder 17.03.2025
Цепочка ответственности — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке потенциальных обработчиков, пока один из них не обработает запрос. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru