From 047b05fd2a7c4fa90a7ff888d158aca21e09aa77 Mon Sep 17 00:00:00 2001 From: Desislava Shunina <115353472+desiish@users.noreply.github.com> Date: Tue, 10 Dec 2024 16:12:05 +0200 Subject: add pract10 --- Practicum/pract10/readme.md | 147 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 Practicum/pract10/readme.md (limited to 'Practicum') diff --git a/Practicum/pract10/readme.md b/Practicum/pract10/readme.md new file mode 100644 index 0000000..44e2778 --- /dev/null +++ b/Practicum/pract10/readme.md @@ -0,0 +1,147 @@ + +# `std::unordered_map` и `std::unordered_set` + +## Въведение в `std::unordered_set` + +`std::unordered_set` е асоциативен контейнер, който съхранява уникални обекти в произволен ред. +Обикновено е реализиран чрез хеш таблица използваща separate chaining. + +При създаване на обект от тип `std::unordered_set`, могат да се зададат следните параметри: + +```c++ +template< + class Key, + class Hash = std::hash, + class KeyEqual = std::equal_to, + class Allocator = std::allocator +> class unordered_set; +``` + +- **Key** + Типът на обектите, които ще се съхраняват в множеството. + +- **Hash** + Хешираща функция, която изчислява хеш стойности за обектите. + *По подразбиране:* Използва се `std::hash`. + +- **KeyEqual** + Функция за сравнение, която проверява дали два обекта са равни. + *По подразбиране:* Използва се `std::equal_to`. + +- **Allocator** + Механизъм за управление на паметта, който определя как ще се разпределя и освобождава паметта за елементите в множеството. + *По подразбиране:* Използва се стандартният алокатор `std::allocator`. + +--- + +### Операции + +- **Добавяне на елементи**: `unordered_set.insert(value)` - Θ(1) (average-case), O(N) (worst-case) +- **Премахване на елементи**: `unordered_set.erase(value)`- Θ(1) (average-case), O(N) (worst-case) +- **Търсене на елементи**: `unordered_set.find(value)` - Θ(1) (average-case), O(N) (worst-case) +- **Проверка на размера**: `unordered_set.size()` - O(1) + +--- + +```c++ +#include +#include + +int main() { + std::unordered_set mySet = {3, 1, 2, 5, 4, 8, 3}; + + for (auto it = mySet.begin(); it != mySet.end();) { + if (*it % 2 == 0) { + it = mySet.erase(it); + } else { + ++it; + } + } + + for (auto& el : mySet) { + std::cout << el << ' '; + } + + return 0; +} +``` + +--- + +## Въведение в `std::unordered_map` + +`std::unordered_map` е асоциативен контейнер, който съхранява двойки ключ-стойност в произволен ред. Ключовете са уникални, като всеки ключ съответства на една стойност. Обикновено е реализиран чрез хеш таблица иползващ separate chaining. + +--- + +### Шаблон за декларация + +```c++ +template< + class Key, + class T, + class Hash = std::hash, + class KeyEqual = std::equal_to, + class Allocator = std::allocator> +> class unordered_map; +``` + +- **Key** + Типът на ключовете. + +- **T** + Типът на стойностите. + +- **Hash** + Хешираща функция, която изчислява хеш стойности за ключовете. + *По подразбиране:* Използва се `std::hash`. + +- **KeyEqual** + Функция за сравнение, която проверява дали два ключа са равни. + *По подразбиране:* Използва се `std::equal_to`. + +- **Allocator** + Механизъм за управление на паметта, който определя как ще се разпределя и освобождава паметта за елементите в контейнера. + *По подразбиране:* Използва се `std::allocator>`. + +--- + +### Операции + +- **Добавяне на елементи**: `unordered_map[key] = value` - Θ(1) (average-case), O(N) (worst-case) +- **Достъп до елементи**: `unordered_map[key]` - Θ(1) (average-case), O(N) (worst-case) +- **Премахване на елементи**: `unordered_map.erase(key)` - Θ(1) (average-case), O(N) (worst-case) +- **Търсене на елементи**: `unordered_map.find(key)` - Θ(1) (average-case), O(N) (worst-case) +- **Проверка на размера**: `unordered_map.size()` - O(1) + +--- + +```c++ +#include +#include + +int main() { + std::unordered_map myMap = { + {"Three", 3}, + {"One", 1}, + {"Two", 2} + }; + + for (auto it = myMap.begin(); it != myMap.end(); ++it) { + std::cout << "Key: " << it->first << ", Value: " << it->second << '\n'; + } + + for (auto& pair : myMap) { + std::cout << "Key: " << pair.first << ", Value: " << pair.second << '\n'; + } + + // C++ 17 + for (auto& [key, value] : myMap) { + std::cout << "Key: " << key << ", Value: " << value << '\n'; + } + + return 0; +} +``` +---- +[Линк към задачите](https://leetcode.com/problem-list/asohzosr/) -- cgit v1.3.1-23-gd82d