/
Oppq
/
Labs
Обзор
Документация
Войти
/
Oppq
/
Labs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lab6/Task1.cpp
574 строки
16 KB
Oppq
Задание Г
25 мар 2026, 18:40
Верифицирован
25 мар 2026, 18:40
75876be
Код
Авторство
О чём код?
#include <iostream> #include <array> #include <vector> #include <list> #include <set> #include <map> #include <string> #include <algorithm> #include <fstream> #include <random> // На данный момент будут присутствовать комментарии, т.к. только происходит изучение как работают, инициализируются, изменяются библиотеки STL (контейнеры), в итоговой версии их не будет // Структура для задания "В" из Лабораторной работы №3 struct Child { string surname; string name; string birthDate; string parents; int childrenCount; int height; int weight; string group; }; // Функция для вывода using namespace std; template<typename T> void show(const string& name, const T& c) { cout << name << ": "; for (auto x : c) cout << x << " "; cout << endl; } // Все функции вывода // Вывод одного ребёнка void printChild(const Child& c) { cout << c.surname << " " << c.name << "|" << c.group << "|рост " << c.height << "|вес " << c.weight << endl; } // Вывод всех детей void printChildren(const string& name, const list<Child>& lst) { cout << name << ":\n"; for (const auto& c : lst) { cout << " "; printChild(c); } cout << endl; } void showMap(const string& name, const map<int, string>& m) { cout << name << ":\n"; for (auto& p : m) cout << " " << p.first << "->" << p.second << endl; } void printMap(const string& name, const multimap<int, string>& m) { cout << name << ":\n"; for (const auto& [key, val] : m) cout << " " << key << "->" << val << endl; } void printSet(const string& name, const unordered_set<int>& s) { cout << name << ": "; for (const auto& x : s) cout << x << " "; cout << " (порядок может быть совершенно любым)" << endl; } // Убираем автоматическое формирование файла, тк неудобно для каждого контейнера + ошибки в работе int main() { setlocale(LC_ALL, "Russian"); // Распишем для каждого контейнера по 4 способа инициализации + Задания (поиск по итератору, копирование, добавление, удаление), для удобства обозначу (после удалю, или оставлю как просто материал для ориентировки по коду) - (1) Добавление (2) Удаление (3) Поиск (4) Изменение (5) Копирование (6) Чтение из файла, тк будет информация браться из них // ARRAY cout << "\nARRAY:\n"; // Инициализация, 4 способа array<int, 5> a = { 1, 2, 3, 4, 5 }; array<int, 5> arr2; arr2.fill(7); array<int, 5> arr3 = arr1; array<int, 5> arr4; for (int i = 0; i < arr4.size(); i++) {arr4[i] = i;} // Операции, (1), (2) невозможно реализовать, тк массив (array), изначально имеет фиксированный размер с заданными элементами (или {} = 0, 0, 0, ...), можно совершить заменой уже существующих элементов // (3) auto it = find(a.begin(), a.end(), 3); if (it != a.end()) cout << "Нашли: " << *it << endl; // (4), можно использовать за место удаления/добавления a[2] = 33; show("array после изменения", a); // (6) array<int, 5> arrFile; ifstream arrIn("array_data.txt"); for (int i = 0; i < 5; i++) {arrIn >> arrFile[i];} arrIn.close(); print(" - Из файла", arrFile); // VECTOR // Инициализация cout << "\nVECTOR:\n"; vector<int> v1 = { 10, 20, 30 }; // Списочная инициализация (1) vector<int> v2(3, 5); // Через конструктор с размером (2) vector<int> v3; // Последовательное добавление (3) v3.push_back(100); v3.push_back(200); vector<int> v4(v.begin(), v1.end()); // Из другого контейнера // (1) v1.push_back(60); auto vit = v1.begin() + 1; // Итератор как указатель - [10, 20, 30] -> [10, 99, 20, 30] v1.insert(vit, 99); // или v1.insert(vit, 1, 99) вроде как show("v1 после добавления", v1); // (2) v1.erase(v1.begin() + 3); show("v1 после удаления", v1); // (3) auto vfind = find(v.begin(), v1.end(), 40); if (vfind != v1.end()) cout << "Поиск: нашли " << *vfind << endl; // (4) v1[0] = 777; show("v1 после изменения", v1); // (5) vector<int> v5 = v1; // Копирование из другого контейнера (4) ; Можно задать таким образом : vector<int> v4(v1.begin(), v1.end()); show("v5 (копия)", v5); // (6) vector<int> vecFile; ifstream vecIn("vector_data.txt"); int va; while (vecIn >> va) vecFile.push_back(va); vecIn.close(); print("Из файла", vecFile); // LIST // Инициализвция cout << "\nLIST:\n"; list<int> l = { 5, 4, 3, 2, 1 }; list<int> l2(5, 7); list<int> l3; lst3.push_back(100); lst3.push_back(200); lst3.push_back(300); list<int> l4(l.begin(), l.end()); // (1) l.push_back(99); l.push_front(100); auto lit = l.begin(); advance(lit, 2); l.insert(lit, 777); print("После добавления", l); // (2) l.remove(4); show("list после удаления 4", l); // (3) auto lfind = find(l.begin(), l.end(), 3); if (lfind != l.end()) cout << "Найден элемени '3'" << endl; // (4) for (auto& x : l) if (x == 2) x = 222; print("После изменения", l); // (5) list<int> lstCopy = l; print("Копия", lstCopy); // (6) list<int> lstFile; ifstream lstIn("list_data.txt"); int lval; while (lstIn >> lval) lstFile.push_back(lval); lstIn.close(); print("Из файла", lstFile); // SET // Инициализация cout << "\nSET:\n"; set<int> s1 = { 3, 1, 4, 1, 5, 9, 2 }; set<int> s2; set2.insert(10); set2.insert(20); set2.insert(30); s.insert(7); set<int> s3(s1.begin(), s1.end()); set<int> s4; for (int i = 0; i < 5; i++) {s4.insert(i);} // (1) s1.insert(7); s1.insert(6); print("После добавления", s1); // (2) s1.erase(4); print("После удаления 4", s1); // (3) auto sit = s1.find(5); if (sit != s1.end()) {cout << " Поиск: нашли " << *sit << endl;} // Языковая модель, указатель на элемент // (4) s1.erase(3); s1.insert(33); print("После изменения", s1); // (5) set<int> setCopy = s1; print("Копия", setCopy); // (6) set<int> setFile; ifstream setIn("set_data.txt"); int sval; while (setIn >> sval) setFile.insert(sval); setIn.close(); print(" Из файла", setFile); // MAP // Инициализация cout << "\nMAP:\n"; map<int, string> m = {{1, "один"}, {2, "два"}, {3, "три"}}; map<int, string> m2 ; m2[1] = "один"; m2[2] = "два"; m2[3] = "три"; m2.insert({ 4, "четыре" }); map<int, string> m3; m3.insert({5, "пять"}); m3.insert({6, "шесть"}); m3.insert({7, "семь"}); map<int, string> m4(m.begin(), m.end()); // (1) m[4] = "четыре"; m.insert({5, "пять"}); printMap("После добавления", m); // (2) m.erase(2); printMap("После удаления ключа '2'", m); // (3) auto mit = m.find(2); // поиск по ключу - значение (основное положение map) if (mit != m.end()) cout << "Нашли ключ 2: " << mit->second << endl; // (4) m[2] = "ДВА"; showMap("map после изменения", m); // (5) map<int, string> mapCopy = map1; // Без вывода, не понял как работает вывод при копировании (языковая модель - for (const auto& [k, v] : mapCopy) cout << " " << k << " >> " << v << endl;) // (6) map<int, string> mapFile; ifstream mapIn("map_data.txt"); int key; string value; while (mapIn >> key >> value) mapFile[key] = value; mapIn.close(); // MultiMap cout << "\nMultiMap:\n"; // Инициализация multimap<int, string> mm1 = {{1, "один"}, {2, "два"}, {2, "two"}, {3, "три"}}; multimap<int, string> mm2; mm2.insert({10, "десять"}); mm2.insert({20, "двадцать"}); mm2.insert({20, "twenty"}); multimap<int, string> mm3(mm1.begin(), mm1.end()); multimap<int, string> mm4; for (int i = 0; i < 3; i++) { mm4.insert({i, "число" + to_string(i)}); mm4.insert({i, "number" + to_string(i)}); } // (1) mm.insert({4, "четыре"}); mm.insert({4, "four"}); printMap("После добавления", mm); // (2) mm1.erase(2); printMap("После удаления всех с ключом 2", mm1); // (3) // Пересмотрено : ! find(key) в multimap возвращает только первый элемент с таким ключом, а не все. ! ; Проходимся по всем элементам int key = 2; auto range = mm.equal_range(key); cout << "Поиск эл-тов с ключём " << key << "\n"; for (auto it = range.first; it != range.second; ++it) { cout << " " << it->first << " -> " << it->second << endl; } cout << endl; // (5) multimap<int, string> copy = mm; printMap(copy, "5. КОПИЯ (новый контейнер):"); // Пересмотрено, упрощено // (4) auto r = mm.equal_range(3); // equal_range(3) возвращает два итератора:range.first/second указывает на первый/последний элемент с ключом 3 for (auto it = r.first; it != r.second;) { if (it->second == "три") { it = mm.erase(it); // удаляем старую mm.insert({3, "ТРИ"}); // идём к следующей -> берём новое значение } else {++it;} } printMap(mm, "4. ПОСЛЕ ИЗМЕНЕНИЯ ('три' -> 'ТРИ'):"); // (6) multimap<int, string> mmFile; ifstream mmIn("multimap_data.txt"); int mkey; string mvalue; while (mmIn >> mkey >> mvalue) { mmFile.insert({mkey, mvalue}); } mmIn.close(); // Unordered set cout << "\nUNORDERED_SET:\n"; unordered_set<int> us1 = {5, 3, 8, 1, 9, 3, 2}; unordered_set<int> us2; us2.insert(10); us2.insert(20); us2.insert(30); unordered_set<int> us3(uset1.begin(), us1.end()); unordered_set<int> us4; for (int i = 0; i < 5; i++) {us4.insert(i);} // (1) us1.insert(42); us1.insert(15); printSet("После добавления", us1); // (2) us1.erase(3); printSet("После удаления 3", us1); // (3) auto ufind = us1.find(5); if (ufind != us1.end()) cout << "Поиск: " << *ufind << endl; // (4) us1.erase(8); us1.insert(88); printSet("После изменения (8→88)", us1); // (5) unordered_set<int> usCopy = us1; printSet("Копия", usCopy); // (6) unordered_set<int> usFile; ifstream usIn("unordered_set_data.txt"); int uval; while (usIn >> uval) usFile.insert(uval); usIn.close(); printSet("Из файла", usFile); // Доп задание из 3-ей Лабораторной, через List (по заданию любой контейнер) Сами наполнености сгенерированны языковой моделью cout << "\nList, задание "В":\n"; list<Child> children = { {"Иванов", "Миша", "12.05.2019", "Иванов И.И.", 2, 110, 18, "Средняя"}, {"Петрова", "Аня", "23.03.2020", "Петрова А.А.", 1, 105, 16, "Средняя"}, {"Сидоров", "Миша", "05.12.2018", "Сидоров С.С.", 3, 115, 20, "Старшая"}, {"Кузнецова", "Оля", "17.08.2019", "Кузнецова О.О.", 2, 108, 17, "Средняя"}, {"Михайлов", "Миша", "30.01.2020", "Михайлов М.М.", 1, 102, 15, "Младшая"} }; printChildren("Дети (список иниц1)", children); list<Child> children2; children2.push_back({"Волков", "Дима", "10.10.2019", "Волков В.В.", 2, 112, 19, "Средняя"}); children2.push_back({"Соколова", "Катя", "25.05.2020", "Соколова К.К.", 1, 104, 15, "Младшая"}); printChildren("Дети (push_back, иниц2)", children2); // (1) children.push_back({"Новиков", "Петя", "15.07.2019", "Новиков П.П.", 2, 109, 18, "Средняя"}); printChildren("После добавления", children); // (2) for (auto it = children.begin(); it != children.end(); ++it) { if (it->name == "Петя") { children.erase(it); break; } } printChildren("После удаления", children); // (3) cout << "Поиск детей с именем Миша:\n"; for (auto it = children.begin(); it != children.end(); ++it) { if (it->name == "Миша") { cout << "Нашли: "; printChild(*it); } } cout << endl; // (4) for (auto& c : children) { if (c.surname == "Иванов" && c.name == "Миша") { c.height = 118; cout << "Изменён рост Миши Иванова на 118 см\n"; } } // (5) list<Child> copy = children; printChildren("Копия", copy); // (6) ifstream file("children.txt"); if (file.is_open()) { list<Child> fromFile; string s, n, bd, p, g; int cnt, h, w; while (file >> s >> n >> bd >> p >> cnt >> h >> w >> g) { fromFile.push_back({s, n, bd, p, cnt, h, w, g}); } file.close(); cout << "Загружено из файла:\n"; for (const auto& c : fromFile) { cout << " " << c.surname << " " << c.name << endl; } } else {cout << "Файл children.txt не найден\n";} printChildren("После изменения", children); return 0; }