Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 16.01.2019
Сообщений: 10

Использование map для хранения класса

18.12.2019, 00:25. Показов 2164. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс Day в котором было два поля string date и vector <Task> tasks<<вектор хранит в себе другой класс с полями типа int string и тд. Тоесть мы сощдаем подобие ежедневника,но на данный момент есть возможность задания целей только на один день. Нужно добавить возможность создания второго дня в котором также будут цели(все то что есть в структуре Task),сказали использовать только map.
C++
1
2
3
4
5
6
Class Task
{
int time;
string name;
bool made;
}
C++
1
2
3
4
5
Class Day
{
string date;
vector <Task>tasks;
}
Думал написать так:
map<string,Day*> Days;
Но вот добавить сюда что-то не могу ругается на аргументы
Days.insert(pair<string,Day*>{ключ(время из класса Day),d});

Само задание:
1. Возможность добавление задачи на любой день (как на конкретное время, так и просто "в течение дня").
2. Просмотр расписания с фильтрацией: "все задачи/выполненные/не выполненные", с возможностью сортировки по приоритету/времени. Фильтры и тип сортировки задаются в настройках программы.
3. Поиск задач и их редактирование (изменение статуса "Выполнено")/удаление, как по одной, так и сразу всех найденных. Поле поиска указывает пользователь: по имени задачи (части имени)/дате.
4. Сохранение ежедневника в файл/загрузка из файла.
5. Предупреждение пользователя, если есть несохраненные данные (при выходе и загрузке нового ежедневника из файла)
Day.h
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
69
70
71
72
73
74
75
76
77
78
79
#pragma once
#ifndef _DAY_H_
#define _DAY_H_
#include "Task.h" 
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <ostream>
#include <sstream>
#include <algorithm>
#include <map>
using namespace std;
 
class Day 
{
    public:
        string date = "undefined";
        vector <Task> tasks;
        Day InputDay(const Day& d, const Task& t);  
        void PrintDay(const Day& d);
        void PrintForSaveDay(ostream& save, const Day& d);
        Day GetDay(istream& get);
    
};
 
 
void PrintDay(const Day& d, ChangeF Pd)
{
    cout << "Текущая дата:" << d.date << endl << "\n=============================================" << endl << "Количество задач к выполнению:" << d.tasks.size();
    cout << "\n=============================================" << endl;
    for (auto& t : d.tasks)
        PrintTask(t, Pd);
}
 
Day InputDay()
{
    setlocale(LC_ALL, "Russian");
    Day d;
    cout << "\nВвесте дату в виде дд ENTER мм ENTER гггг ENTER друг за другом" << endl;
    int dd, mm, yyyy;
    dd = DigitInputCheck(1, 30);
    mm = DigitInputCheck(1, 12);
    yyyy = DigitInputCheck(0, 4000);
    ostringstream WriteDate;
    WriteDate << dd << "." << mm << "." << yyyy << endl;
    d.date = WriteDate.str();
    cout << "Количество задач:" << endl;
    int aims;
    cin >> aims;
    for (int i = 0; i < aims; i++)
    {
        d.tasks.push_back(InputTask());
    }
 
    return d;
 
}
 
void PrintForSaveDay(ostream& save, const Day& d)
{
    save << d.date << endl << d.tasks.size();
    for (auto& t : d.tasks)
        PrintForSaveTask(save, t);
    }
 
Day GetDay(istream& get)
{
    Day d;
    int aims;
    get >> d.date >>aims ;
    for (int i = 0; i < aims; i++)
        d.tasks.push_back(GetTask(get));
    return d;
    }
 
 
 
#endif
Task.h
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#pragma once
#ifndef _TASK_H_
#define _TASK_H_
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <ostream>
#include <sstream>
#include <algorithm>
#include <map>
using namespace std;
 
class Task
{   
public:
    string study;
    int time;
    bool made;
    int priority;
    template <typename T>
    T DigitInputCheck(T min, T max);
    Task InputTask(const Task& t);
    void PrintTask(const Task& t);
    void Change();
    string format1(int time);
    string format2(int time);
    void PrintForSaveTask(ostream& save, const Task& t);
    Task GetTask(istream& get);
    
};
 
 
 
template <typename T>
T DigitInputCheck(T min, T max)
{
    int x;
    do
    {
        cout << "Введите число (от" << min << ", " << max << "до)" << endl;
        while (!(cin >> x))
        {
            cin.clear();
            cin.ignore(10000, '\n');
        }
        
    } while (x< min || x> max);
    return x;
}
typedef string(*ChangeF)(int);
string format1(int time)
{ 
    setlocale(LC_ALL, "Russian");
    ostringstream format;
    format << time / 100 << " ч " << time % 100 << " м " << endl;
    return format.str();
}
string format2(int time)
{
    stringstream format;
    format << time / 100 << " : " << time % 100 << endl;
    return format.str();
}
void PrintTask(const Task& t, ChangeF Pt)
{
    setlocale(LC_ALL, "Russian");
    cout << "Задание:\n" << t.study << "\n\nПриоритетность: " << t.priority << endl;
    string stime = Pt(t.time);
    cout << "\nВремя начала выполнения:\n" << stime << endl << "\nВыполнение:" << t.made << "\n=============================================" << endl;
};
 
void change(Task& t)
{
    t.made = !t.made;
}
 
Task InputTask()
{
    Task t;
    setlocale(LC_ALL, "Russian");
    cout << "Задание:" << endl;
    cin >> t.study;
    cout << "Приоритетность задания: ";
    cin >> t.priority;
    cout << "Время начала выполнения задания:" << endl;
    int hours, minutes;
    hours = DigitInputCheck(0, 23);
    minutes = DigitInputCheck(0, 59);
    t.time = hours * 100 + minutes;
    t.made = false;
    return t;
}
 
void PrintForSaveTask(ostream& save, const Task& t)
{
    save << t.study << endl << t.time << endl << t.made << endl << t.priority;
}
 
 
Task GetTask(istream& get)
{
    Task t;
    getline(get, t.study);
    get >> t.time >> t.made >> t.priority;
    return t;
}
#endif
main.cpp
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include "Day.h" 
#include "Task.h"
class Day;
class Task;
int Menu()
{
    setlocale(LC_ALL, "Russian");int action;
    cout << "1.Ввести информацию по дню" << endl << "2.Вывести информацию по дню" << endl << "3.Изменение признака Выполнено у задачи" << endl << "4.Добавить/Удалить задачу/Поиск задачи" << endl;
    cout << "5.Выбрать формат" << endl << "6.Сохранить в файл" << endl << "7.Считать из файла" << endl<< "8.Новый день"<< "0.Введите для выхода" << endl;
    cin >> action;return action;
}
int  MenuSort()
{
    setlocale(LC_ALL, "Russian");cout << "Отсортировать задачи?" << endl << "1.Да" << endl << "2.Нет" << endl;int  action1=DigitInputCheck(1,2);return action1;
}
int  MenuSort2()
{   
    setlocale(LC_ALL, "Russian");
    cout << "По какому признаку отсортировать?" << endl << "1.По приоритету" << endl << "2.По времени" << endl;int action2 = DigitInputCheck(1,2);return action2;
}
 
int main()
{
    Day* ptr = NULL;
    map<string,Day*> Days;
    setlocale(LC_ALL, "Russian");
    int k = 0;
    Day d;
    Task t;
    vector <Task> result;
    for (;;)
    {
        ChangeF TimeFormats[2] = { format1,format2 };
        int act = Menu();
        switch (act)
        {
 
        case 0:
        {
            cout << 0;
            return 0;
        }
        case 1:
        {
            system("cls");
            cout << "Введите информацию по дню" << endl; d = InputDay();
            break;
        }
        case 2:
        {
 
            if (d.tasks.size() == 0)
            {
                system("cls");
                cout << "Введеная информация по дню" << endl << "\n";
                PrintDay(d, TimeFormats[1]);
                cout << "\n";
                break;
            }
            else
            {
                int act1 = MenuSort();
                switch (act1)
                {
                case 1:
                {
                    int act2 = MenuSort2();
                    switch (act2)
                    {
                    case 1:
                    { 
                        system("cls"); cout << "Отсортированный массив по приоритету" << endl; sort(d.tasks.begin(), d.tasks.end(), [](const Task& t1, const Task& t2) { return t1.priority < t2.priority; }); if (k == 0) { PrintDay(d, TimeFormats[1]); break; }else{ PrintDay(d, TimeFormats[k-1]); break; }
                    }
                    case 2:
                    {
                    system("cls"); cout << "отсортированный массив по времени" << endl;   sort(d.tasks.begin(), d.tasks.end(), [](const Task& t1, const Task& t2) { return t1.time < t2.time; }); if (k == 0) { PrintDay(d, TimeFormats[1]); break; }else { PrintDay(d, TimeFormats[k - 1]); break; }
                    }
                    break;
                    }
                    break;
                }
 
                case 2:
                {   
                system("cls"); cout << "Неотсортированное:"; cout << "Введеная информация по дню" << endl; if (k == 0) { PrintDay(d, TimeFormats[1]); cout << "\n"; break; }else{ PrintDay(d, TimeFormats[k - 1]); cout << "\n"; break; }
                }
                break;
                }
            }
            break;
        }
 
 
        case 3:
        {
            if (d.tasks.size() == 0) { system("cls"); cout << "Ничего не введено" << endl << "\n"; break; }
            else {
                system("cls"); cout << "Задачи пронумерованы по порядку от 0 до заданного количнства задач,введите номер задания чтобы изменить его статус" << endl << "Введите номер задания ";
                int Complete = DigitInputCheck(0, (int)d.tasks.size() - 1);
                change(d.tasks[Complete]);
                for (int i = 0; i < d.tasks.size(); i++)
                {
                    cout << i + 1 << ".";  PrintTask(d.tasks[i], TimeFormats[1]);  cout << "================================" << endl;
                }break;
            }
        }
        case 4:
        {
            int opt;
            cout << "1.Добавить задачу в ежедневник\n" << "2.Удалить задачу из ежедневника\n" << "3.Поиск задачи\n"; opt = DigitInputCheck(1, 3);
            if (opt == 1) { d.tasks.push_back(InputTask()); PrintDay(d, TimeFormats[1]); break; break; }
            else if (opt == 2) {
                if (d.tasks.size() == 0) { cout << "no tasks entered" << endl; break; }
                else {
                    string name; cin >> name;
                    d.tasks.erase(remove_if(d.tasks.begin(), d.tasks.end(), [name](const Task& rem) {return rem.study == name; }), d.tasks.end());
                    PrintDay(d, TimeFormats[1]); break;
                }
            }
            else if (opt == 3)
            {
                string nameee;cin >> nameee;copy_if(d.tasks.begin(), d.tasks.end(), back_inserter(result), [nameee](const Task& find){return  find.study == nameee; });
                for (auto ft : result)
                {cout << "\nЗадание\t" << ft.study << "\tВремя начала выполнения\t" << ft.time << "\tПриоритетность\t" << ft.priority << endl;}
                result.clear();
                break;
            }
        }
        case 5:
        {
            cout << "В каком формате вывести время?" << endl << "1. 00 ч 00 м" << endl << "2. 00:00" << endl; k = DigitInputCheck(1, 2); string stime = TimeFormats[k - 1](t.time);  break;
        }
        case 6:
        {
            string name; cout << "Задайте имя файла  "; cin >> name; ofstream Save(name); if (!Save)continue; PrintForSaveDay(Save, d); Save.close();    cout << "Сохранение выполнено,название файла :" << name << "\n"; break;
        }
        case 7:
        {
            cout << "Напишите имя файла   "; string name; cin >> name; ifstream Read(name); d = GetDay(Read); if (!Read.is_open()) { cout << "Файл не найден..\n"; }
            else { cout << "\nВыгрузка из файла " << name << "  выполнена\n"; }; continue; break;   }
        case 8:
        {
            
        }
        }
    }
 
}
код g но блин учусь
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.12.2019, 00:25
Ответы с готовыми решениями:

Контейнер Map. Использование класса как ключ
class A{ int X;}; class B{ public: int y;}; int main() { A objA; B objB; map&lt;A,B&gt; m; m.y=1; //kak? ...

Использование файлов для обработки и хранения данных
https://www.cyberforum.ru/attachment.php?attachmentid=927921&amp;stc=1&amp;d=1523447181 Дан файл f1 , который содержит номера телефонов...

Использование линейного списка для хранения последовательности
Разработать программу, которая организует с использованием линейного списка хранение последовательности, а так же выполняет следующие...

3
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.12.2019, 00:46
Цитата Сообщение от aigoo038 Посмотреть сообщение
Думал написать так:
map<string,Day*> Days;
Но вот добавить сюда что-то не могу ругается на аргументы
Days.insert(pair<string,Day*>{ключ(время из класса Day),d});
Раз уж на то пошло, то map<string,Day> Days;

Однако map - это ключ - значение,
если ключом является какая то характеристика значения, то map не подойдет(для хранения достаточно set с самописным компаратором, а редактирование поля ключа не доступно для set или нарушает логику в случае с map). Наверное вам нужен multimap<date, task>
0
0 / 0 / 0
Регистрация: 16.01.2019
Сообщений: 10
10.01.2020, 20:06  [ТС]
zayats80888,
C++
1
2
3
4
5
6
7
      multimap<string, Day>Days;
            multimap<string, Day>::iterator it;
            Days.insert(pair<string, Day>(s, d));
            for (it = Days.begin(); it != Days.end(); ++it)
            {
                cout << it->first << " " << it->second << '\n';
            }
Добавлено через 1 минуту
zayats80888,
такие вот ошибки выдает
E0349 отсутствует оператор "<<", соответствующий этим операндам
C2679 бинарный "<<": не найден оператор, принимающий правый операнд типа "_Ty2" (или приемлемое преобразование отсутствует)
with
[ _Ty2=Day ]
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
11.01.2020, 07:20
Цитата Сообщение от aigoo038 Посмотреть сообщение
такие вот ошибки выдает
нужно определить std::ostream& operator<<(std::ostream&, const Day&);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2020, 07:20
Помогаю со студенческими работами здесь

Std::function для хранения функции класса
class test { public: test() { f = display5; //Как правильно написать? } void setFunction(function&lt;void()&gt; func) ...

Использование класса для хранения данных.
Можно ли использовать класс как структуру (struct) для хранения и преобразования данных? Все классы примера находятся в одном...

Использование googleusercontent для хранения файлов
стоит ли использовать ссылки на https://doc-00-0g-docs.googleusercontent.com?

Предусмотреть использование типизированного файла для хранения информации
Здравствуйте.По заданию мне нужно предусмотреть использование типизированного файла для хранения информации. У меня есть программа с...

Разработать шаблон класса для хранения данных (контейнер)
Я не понял как описать шаблон класса для хранения данных (контейнер). Данные должны хранится, например, в виде массива. Шаблон должен...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru