Advertisement
35657

Untitled

Aug 25th, 2023
1,068
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.93 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <initializer_list>
  4. #include <iostream>
  5.  
  6.  
  7. template <typename T>
  8. class Set {
  9.  
  10. public:
  11.  
  12.     struct Node {
  13.         T value{};
  14.         Node* left = nullptr;
  15.         Node* right = nullptr;
  16.         Node* parent = nullptr;
  17.     };
  18.  
  19.     class Iterator {
  20.     public:
  21.         Iterator(Node* node) : node_(node) {}
  22.  
  23.         T& operator*() { // перегрузка оператора разыменования
  24.             return node_->value;
  25.         }
  26.  
  27.         Iterator operator++() { // перегрузка префиксной формы инкремента
  28.             if (!node_) {
  29.                 throw std::runtime_error("Пустой контейнер");
  30.             }
  31.             if (node_->right) {
  32.                 node_ = node_->right;
  33.                 while (node_->left) {
  34.                     node_ = node_->left;
  35.                 }
  36.                 return *this;
  37.             }
  38.             Node* temp = node_->parent;
  39.             while (temp != nullptr && node_->value > temp->value) {
  40.                 temp = temp->parent;
  41.             }
  42.             node_ = temp;
  43.             return *this;
  44.         }
  45.  
  46.         Iterator operator++(int) { // перегрузка постфиксной формы инкремента
  47.             return ++(*this);
  48.         }
  49.  
  50.         Iterator operator--() { // перегрузка префиксной формы декремента
  51.             if (!node_) {
  52.                 throw std::runtime_error("Пустой контейнер");
  53.             }
  54.             if (node_->left) {
  55.                 node_ = node_->left;
  56.                 while (node_->right) {
  57.                     node_ = node_->right;
  58.                 }
  59.                 return *this;
  60.             }
  61.             Node* temp = node_->parent;
  62.             while (temp != nullptr && node_->value < temp->value) {
  63.                 temp = temp->parent;
  64.             }
  65.             node_ = temp;
  66.             return *this;
  67.         }
  68.  
  69.         Iterator operator--(int) { // перегрузка постфиксной формы декремента
  70.             return --(*this);
  71.         }
  72.  
  73.         Iterator operator+(int n) {
  74.             Iterator temp(node_);
  75.             while (n) {
  76.                 temp++;
  77.                 n--;
  78.             }
  79.             return temp;
  80.         }
  81.  
  82.         Iterator operator-(int n) {
  83.             Iterator temp(node_);
  84.             while (n) {
  85.                 temp--;
  86.                 n--;
  87.             }
  88.             return temp;
  89.         }
  90.  
  91.         bool operator==(Iterator other) {
  92.             return node_ == other.node_;
  93.         }
  94.  
  95.         bool operator!=(Iterator other) {
  96.             return node_ != other.node_;
  97.         }
  98.  
  99.     private:
  100.         Node* node_ = nullptr;
  101.     };
  102.  
  103.     Iterator begin() {
  104.         return Iterator(Min(root));
  105.     }
  106.  
  107.     Iterator end() {
  108.         return Iterator(nullptr);
  109.     }
  110.  
  111.     Set() : size(0), root(nullptr) {}
  112.  
  113.     Set(const std::initializer_list<T>& list) : size(0), root(nullptr) {
  114.         for (const auto& element : list) {
  115.             Insert(element);
  116.         }
  117.     }
  118.  
  119.     Set(const Set& other) : size(other.size), root(Copy(other.root, nullptr)) {}
  120.  
  121.     Set(Set&& other) : size(other.size), root(other.root) {
  122.         other.size = 0;
  123.         other.root = nullptr;
  124.     }
  125.  
  126.     Set& operator=(const Set& other) {
  127.         if (this != &other) {
  128.             Clear();
  129.             size = other.size;
  130.             root = Copy(other.root, nullptr);
  131.         }
  132.         return *this;
  133.     }
  134.  
  135.     Set& operator=(Set&& other) {
  136.         if (this != &other) {
  137.             Clear();
  138.             size = other.size;
  139.             root = other.root;
  140.             other.root = nullptr;
  141.             other.size = 0;
  142.         }
  143.         return *this;
  144.     }
  145.  
  146.     Node* Copy(Node* node, Node* parent) {
  147.         if (node == nullptr) {
  148.             return node;
  149.         }
  150.         Node* temp = new Node{ node->value, nullptr, nullptr, parent };
  151.         temp->left = Copy(node->left, temp);
  152.         temp->right = Copy(node->right, temp);
  153.         return temp;
  154.     }
  155.  
  156.     void Insert(const T& val) {
  157.         if (root == nullptr) {
  158.             root = new Node{ val, nullptr, nullptr, nullptr };
  159.             size++;
  160.             return;
  161.         }
  162.         Node* parent = nullptr;
  163.         Node* node = root;
  164.         while (node != nullptr && node->value != val) {
  165.             parent = node;
  166.             node = node->value > val ? node->left : node->right;
  167.         }
  168.         if (node == nullptr) {
  169.             Node* temp = new Node{ val, nullptr, nullptr, parent };
  170.             parent->value > val ? parent->left = temp : parent->right = temp;
  171.             size++;
  172.         }
  173.     }
  174.  
  175.     void Erase(const T& val) {
  176.         Node* parent = nullptr;
  177.         Node* node = root;
  178.         while (node != nullptr && node->value != val) {
  179.             parent = node;
  180.             node = node->value > val ? node->left : node->right;
  181.         }
  182.         if (node != nullptr) {
  183.             if (node->left == nullptr && node->right == nullptr) {
  184.                 if (node == root) {
  185.                     root = nullptr;
  186.                 }
  187.                 else {
  188.                     node == parent->right ? parent->right = nullptr : parent->left = nullptr;
  189.                 }
  190.                 delete node;
  191.             }
  192.             else if (node->left == nullptr) {
  193.                 node->right->parent = node->parent;
  194.                 if (node == root) {
  195.                     root = node->right;
  196.                 }
  197.                 else {
  198.                     node == parent->right ? parent->right = node->right : parent->left = node->right;
  199.                 }
  200.                 delete node;
  201.             }
  202.             else if (node->right == nullptr) {
  203.                 node->left->parent = node->parent;
  204.                 if (node == root) {
  205.                     root = node->left;
  206.                 }
  207.                 else {
  208.                     node == parent->right ? parent->right = node->left : parent->left = node->left;
  209.                 }
  210.                 delete node;
  211.             }
  212.             else {
  213.                 Node* temp = Min(node->right);
  214.                 if (temp->right) {
  215.                     temp->right->parent = temp->parent;
  216.                 }
  217.                 temp == temp->parent->right ? temp->parent->right = temp->right : temp->parent->left = temp->right;
  218.                 node->value = temp->value;
  219.                 delete temp;
  220.             }
  221.             size--;
  222.         }
  223.     }
  224.  
  225.     Node* Find(const T& val) {
  226.         Node* node = root;
  227.         while (node != nullptr && node->value != val) {
  228.             node = node->value > val ? node->left : node->right;
  229.         }
  230.         return node;
  231.     }
  232.  
  233.     int Count(const T& val) {
  234.         return Find(val) == nullptr ? 0 : 1;
  235.     }
  236.  
  237.     Node* Next(Node* node) {
  238.         if (node) {
  239.             if (node->right) {
  240.                 return Min(node->right);
  241.             }
  242.             Node* temp = node->parent;
  243.             while (temp != nullptr && node->value > temp->value) {
  244.                 temp = temp->parent;
  245.             }
  246.             return temp;
  247.         }
  248.     }
  249.  
  250.     Node* Prev(Node* node) {
  251.         if (node) {
  252.             if (node->left) {
  253.                 return Max(node->left);
  254.             }
  255.             Node* temp = node->parent;
  256.             while (temp != nullptr && node->value < temp->value) {
  257.                 temp = temp->parent;
  258.             }
  259.             return temp;
  260.         }
  261.     }
  262.  
  263.  
  264.     Node* Begin() {
  265.         return Min(root);
  266.     }
  267.  
  268.     Node* End() {
  269.         return Max(root);
  270.     }
  271.  
  272.     Node* Min(Node* node) {
  273.         if (node != nullptr)
  274.             while (node->left != nullptr)
  275.                 node = node->left;
  276.         return node;
  277.     }
  278.  
  279.     Node* Max(Node* node) {
  280.         if (node != nullptr)
  281.             while (node->right != nullptr)
  282.                 node = node->right;
  283.         return node;
  284.     }
  285.  
  286.     void Print() {
  287.         Print(root);
  288.         std::cout << std::endl;
  289.     }
  290.  
  291.     void Print(Node* node) {
  292.         if (node != nullptr) {
  293.             Print(node->left);
  294.             std::cout << node->value << " ";
  295.             Print(node->right);
  296.         }
  297.     }
  298.  
  299.     void Clear() {
  300.         Clear(root);
  301.         root = nullptr;
  302.         size = 0;
  303.     }
  304.  
  305.     void Clear(Node* node) {
  306.         if (node == nullptr) {
  307.             return;
  308.         }
  309.         Clear(node->left);
  310.         Clear(node->right);
  311.         delete node;
  312.     }
  313.  
  314.     int Size() {
  315.         return size;
  316.     }
  317.  
  318.     bool Compare(Node* a, Node* b) {
  319.         if (a == nullptr && b == nullptr) {
  320.             return true;
  321.         }
  322.         return (a != nullptr && b != nullptr) && (a->value == b->value) && Compare(a->left, b->left) && Compare(a->right, b->right);
  323.     }
  324.  
  325.     bool operator==(const Set& other) {
  326.         return Compare(root, other.root);
  327.     }
  328.  
  329.     bool operator!=(const Set& other) {
  330.         return !(*this == other);
  331.     }
  332.  
  333.     ~Set() {
  334.         Clear(root);
  335.     }
  336.  
  337. private:
  338.     int size = 0;
  339.     Node* root = nullptr;
  340. };
  341.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement