Vserosbuybuy

C++ base guide 5 (files, unordered containers, multiset)

Mar 12th, 2021
671
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.36 KB | None | 0 0
  1. #include <algorithm>
  2. #include <ctime>
  3. #include <cstdlib>
  4. #include <deque>
  5. #include <iostream>
  6. #include <fstream>
  7. #include <map>
  8. #include <math.h>
  9. #include <queue>
  10. #include <set>
  11. #include <string>
  12. #include <unordered_map>
  13. #include <unordered_set>
  14. #include <vector>
  15.  
  16. using namespace std;
  17.  
  18. int main() {
  19.     // #include <unordered_set>
  20.     // создание неупорядоченного множества (хеш-сета)
  21.     unordered_set<int> st;
  22.     // умеем делать то же самое, что и с обычным
  23.     st.insert(1);
  24.     st.insert(5);
  25.     st.insert(3);
  26.     st.erase(3);
  27.     // но эти операции работают за O(1), то есть константу в отличие от set, где
  28.     // все работает за O(log(размер set))
  29.  
  30.     // и порядок в unordered set - рандомный для нас (зависит от хешей элементов)
  31.     // поэтому при перечислении какого-то конкретного порядка не будет, в отличие от
  32.     // обычного set, где элементы отсортированы по возрастанию
  33.     for (auto x : st) {
  34.         cout << x << " ";
  35.     }
  36.  
  37.     // #include <set>
  38.     // создание мультисета
  39.     // тот же обычный set, но может хранить одинаковые элементы
  40.     multiset<int> mst;
  41.     // умеем делать то же самое, что и с обычным
  42.     mst.insert(1);
  43.     mst.insert(1);
  44.     mst.insert(1);
  45.     // в st окажется 3 единички
  46.    
  47.     mst.insert(5);
  48.     mst.insert(3);
  49.     mst.erase(1);           // удалит все 1 из сета
  50.     // чтобы удалить только одну можно использовать итераторы:
  51.     auto it = mst.find(1);
  52.     if (it != mst.end()) {  // проверяем, что 1 вообще есть, если прокинем нечаянно
  53.                             // st.end() в st.erase() получим ошибку
  54.         mst.erase(it);
  55.     }
  56.  
  57.     // старый добрый порядок сортировки
  58.     for (auto x : mst) {
  59.         cout << x << " ";
  60.     }
  61.  
  62.     // #include <unordered_map>
  63.     // создание хеш таблицы
  64.     unordered_map<string, int> mp;
  65.     // умеем делать то же самое, что и с обычной map
  66.     mp["one"] = 1;
  67.     mp["one"] = 3;
  68.     mp["two"] = 1 + mp["one"];
  69.     mp.erase("one");
  70.     // но эти операции работают за O(1), то есть константу в отличие от map, где
  71.     // все работает за O(log(размер map))
  72.     // достаточно запомнить, что unordered контейнеры делают операции за константу
  73.  
  74.     // и порядок в unordered map - рандомный для нас (зависит от хешей ключей)
  75.     // поэтому при перечислении какого-то конкретного порядка не будет, в отличие от
  76.     // обычного map, где пары ключ-значение отсортированы по возрастанию ключей
  77.     for (auto [k, v] : mp) {
  78.         cout << k << " " << v << "\n";
  79.     }
  80.  
  81.    
  82.     // Работа с файлами
  83.     // #include <fstream>
  84.  
  85.     // Запись в файл
  86.     // создаем объект для записи
  87.     ofstream fout;
  88.     // открываем нужный файл
  89.     fout.open("output.txt");
  90.     // Предыдущие две строчки кода можно объединить в одну:
  91.     // ofstream fout("output.txt");
  92.  
  93.     // Файл мог не открыться по разным причинам, поэтому обязательно проверяем, что все хорошо
  94.     if (!fout.is_open()) {
  95.         cout << "Файл для вывода не открылся\n";
  96.         return 1;       // Завершили программу с ненулевым кодом = возникла ошибка
  97.     }
  98.  
  99.     // для вывода в файл пользуемся fout так же, как пользовались cout
  100.     // для вывода на стандартный поток (в консоль)
  101.     for (auto [k, v] : mp) {
  102.         fout << k << " " << v << "\n";
  103.     }
  104.     // вывели то, что нужно - не забываем закрыть файл в конце
  105.     fout.close();
  106.  
  107.     // Чтение из файла
  108.     // создаем объект для чтения
  109.     ifstream fin;
  110.     // открываем нужный файл
  111.     fin.open("input.txt");
  112.     // Предыдущие две строчки кода можно объединить в одну:
  113.     // ifstream fin("input.txt");
  114.  
  115.     // не забываем проверить, открыли ли мы что-то
  116.     if (!fin.is_open()) {
  117.         cout << "Файл для ввода не открылся\n";
  118.         return 1;       // Завершили программу с ненулевым кодом = возникла ошибка
  119.     }
  120.  
  121.     // для считывания из файла пользуемся fin так же, как пользовались cin
  122.     // для ввода со стандартного потока (из консоль)
  123.     int n;
  124.     fin >> n;
  125.     // считали то, что нужно - не забываем закрыть файл в конце
  126.     fin.close();
  127.  
  128.     // Объекты можно конструировать с флагами, чтобы менять их работу. Основные:
  129.     // ios_base::in - открыть файл для чтения
  130.     // ios_base::out - открыть файл для записи
  131.     // ios_base::app - открыть файл для записи в конец файла
  132.     // ios_base::trunc - удалить содержимое файла, если он существует
  133.     // ios_base::binary - открыть файл в двоичном режиме
  134.  
  135.     // По умолчанию у ifstream создается так:
  136.     ifstream fin("input.txt", ios_base::in);
  137.     // ofstream:
  138.     ofstream fout("output.txt", ios_base::out | ios_base::trunc);
  139.     // несколько флагов разделяются операцией логического или: |
  140.     // по сути, вам в основном можем пригодиться это:
  141.     ofstream fout("output.txt", ios_base::app);     // чтобы дописывать в конец файла что-то новое
  142.  
  143.     // флаги можно передать и в open
  144.     fin.open("input.txt", ios_base::in);
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment