Advertisement
35657

Untitled

Apr 9th, 2024 (edited)
682
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.87 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #include <map>
  4.  
  5. using namespace std;
  6.  
  7. template<typename T, typename S>
  8. class Map {
  9.  
  10. public:
  11.  
  12.     struct Node {
  13.         T key;
  14.         S value;
  15.         Node* left;
  16.         Node* right;
  17.         Node* parent;
  18.     };
  19.  
  20.     Map() : root_(nullptr), size_(0) {}
  21.  
  22.     Map(const Map& other) : root_(copy(other.root_, nullptr)), size_(other.size_) {}
  23.  
  24.     Map(Map&& other) : root_(other.root_), size_(other.size_) {
  25.         other.root_ = nullptr;
  26.     }
  27.  
  28.     Map& operator=(const Map& other) {
  29.         if (this != &other) {
  30.             clear();
  31.             size_ = other.size_;
  32.             root_ = copy(other.root_, nullptr);
  33.         }
  34.         return *this;
  35.     }
  36.  
  37.     Map& operator=(Map&& other) {
  38.         if (this != &other) {
  39.             clear();
  40.             size_ = other.size_;
  41.             root_ = other.root_;
  42.             other.root_ = nullptr;
  43.         }
  44.         return *this;
  45.     }
  46.  
  47.     void insert(const T& key, const S& val) {
  48.         if (root_ == nullptr) {
  49.             root_ = new Node{ key, val, nullptr, nullptr, nullptr };
  50.             size_++;
  51.             return;
  52.         }
  53.         Node* parent = nullptr;
  54.         Node* node = root_;
  55.         while (node != nullptr && node->key != key) {
  56.             parent = node;
  57.             node = node->key > key ? node->left : node->right;
  58.         }
  59.         if (node == nullptr) {
  60.             node = new Node{ key, val, nullptr, nullptr, parent };
  61.             parent->key > key ? parent->left = node : parent->right = node;
  62.             size_++;
  63.         }
  64.     }
  65.  
  66.     void erase(const T& key) {
  67.         Node* parent = nullptr;
  68.         Node* node = root_;
  69.         while (node != nullptr && node->key != key) {
  70.             parent = node;
  71.             node = node->key > key ? node->left : node->right;
  72.         }
  73.         if (node != nullptr) {
  74.             if (node->left == nullptr && node->right == nullptr) {
  75.                 if (node == root_) {
  76.                     root_ = nullptr;
  77.                 }
  78.                 else {
  79.                     node == parent->right ? parent->right = nullptr : parent->left = nullptr;
  80.                 }
  81.                 delete node;
  82.             }
  83.             else if (node->left == nullptr) {
  84.                 node->right->parent = node->parent;
  85.                 if (node == root_) {
  86.                     root_ = node->right;
  87.                 }
  88.                 else {
  89.                     node == parent->right ? parent->right = node->right : parent->left = node->right;
  90.                 }
  91.                 delete node;
  92.             }
  93.             else if (node->right == nullptr) {
  94.                 node->left->parent = node->parent;
  95.                 if (node == root_) {
  96.                     root_ = node->left;
  97.                 }
  98.                 else {
  99.                     node == parent->right ? parent->right = node->left : parent->left = node->left;
  100.                 }
  101.                 delete node;
  102.             }
  103.             else {
  104.                 Node* temp = min(node->right);
  105.                 node->key = temp->key;
  106.                 node->value = temp->value;
  107.                 if (temp->right != nullptr) {
  108.                     temp->right->parent = temp->parent;
  109.                 }
  110.                 temp == temp->parent->right ? temp->parent->right = temp->right : temp->parent->left = temp->right;
  111.                 delete temp;
  112.             }
  113.             size_--;
  114.         }
  115.     }
  116.  
  117.     Node* min(Node* node) {
  118.         if (node != nullptr) {
  119.             while (node->left != nullptr) {
  120.                 node = node->left;
  121.             }
  122.         }
  123.         return node;
  124.     }
  125.  
  126.     Node* max(Node* node) {
  127.         if (node != nullptr) {
  128.             while (node->right != nullptr) {
  129.                 node = node->right;
  130.             }
  131.         }
  132.         return node;
  133.     }
  134.  
  135.  
  136.     void print() {
  137.         print(root_);
  138.         cout << endl;
  139.     }
  140.  
  141.     int size() const {
  142.         return size_;
  143.     }
  144.  
  145.     void clear() {
  146.         clear(root_);
  147.         root_ = nullptr;
  148.         size_ = 0;
  149.     }
  150.  
  151.     bool operator==(const Map& other) {
  152.         return size_ == other.size_ ? compare(min(root_), min(other.root_)) : false;
  153.     }
  154.  
  155.     bool operator!=(const Map& other) {
  156.         return !(*this == other);
  157.     }
  158.  
  159.     Node* find(const T& key) {
  160.         Node* node = root_;
  161.         while (node != nullptr && node->key != key) {
  162.             node = node->key > key ? node->left : node->right;
  163.         }
  164.         return node;
  165.     }
  166.  
  167.     S& operator[] (const T& key) {
  168.         return find(key)->value;
  169.     }
  170.  
  171.     const S& operator[] (const T& key) const {
  172.         return find(key)->value;
  173.     }
  174.  
  175.     ~Map() {
  176.         clear(root_);
  177.     }
  178.  
  179. private:
  180.  
  181.     Node* copy(Node* node, Node* parent) {
  182.         if (node == nullptr) {
  183.             return nullptr;
  184.         }
  185.         Node* temp = new Node{ node->key, node->value, nullptr, nullptr, parent };
  186.         temp->left = copy(node->left, temp);
  187.         temp->right = copy(node->right, temp);
  188.         return temp;
  189.     }
  190.  
  191.     void clear(Node* node) {
  192.         if (node != nullptr) {
  193.             clear(node->left);
  194.             clear(node->right);
  195.             delete node;
  196.         }
  197.     }
  198.  
  199.     Node* next(Node* node) {
  200.         if (node != nullptr) {
  201.             if (node->right != nullptr) {
  202.                 return min(node->right);
  203.             }
  204.             Node* temp = node->parent;
  205.             while (temp != nullptr && node->key > temp->key) {
  206.                 temp = temp->parent;
  207.             }
  208.             return temp;
  209.         }
  210.         return node;
  211.     }
  212.  
  213.     Node* prev(Node* node) {
  214.         if (node != nullptr) {
  215.             if (node->left != nullptr) {
  216.                 return max(node->left);
  217.             }
  218.             Node* temp = node->parent;
  219.             while (temp != nullptr && node->key < temp->key) {
  220.                 temp = temp->parent;
  221.             }
  222.             return temp;
  223.         }
  224.         return node;
  225.     }
  226.  
  227.     bool compare(Node* a, Node* b) {
  228.         if (a == nullptr && b == nullptr) {
  229.             return true;
  230.         }
  231.         return  a->key == b->key && a->value == b->value && compare(next(a), next(b));
  232.     }
  233.  
  234.     void print(Node* node) {
  235.         if (node != nullptr) {
  236.             print(node->left);
  237.             cout << node->key << " " << node->value << endl;;
  238.             print(node->right);
  239.         }
  240.     }
  241.  
  242.     Node* root_;
  243.     int size_;
  244. };
  245.  
  246.  
  247. int main() {
  248.  
  249.     setlocale(LC_ALL, "ru");
  250.  
  251.     Map<string, string> book;
  252.  
  253.     book.insert("Оля", "+71111111111");
  254.     book.insert("Гена", "+71111114444");
  255.     book.insert("Вася", "+71111115555");
  256.     book.insert("Аня", "+71111116666");
  257.  
  258.     book.print();
  259.  
  260.     Map<string, string> book2(book);
  261.  
  262.     cout << book2["Гена"] << endl;
  263.  
  264.     book2["Гена"] = "+71111117777";
  265.  
  266.     book2.print();
  267.  
  268.     cout << (book == book2) << endl;
  269.  
  270.     cout << (book != book2) << endl;
  271.    
  272. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement