illfate

Untitled

Feb 17th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.16 KB | None | 0 0
  1. namespace tiit {
  2. template <typename T>
  3. struct Node {
  4. Node(int v, Node<T>* p) :parent(p), value(v) {}
  5.  
  6. T value;
  7. Node* left;
  8. Node* right;
  9. Node* parent;
  10.  
  11. };
  12.  
  13. template <typename T>
  14. class set {
  15. private:
  16.  
  17. class iterator {
  18. private:
  19. Node<T>* pointer;
  20. public:
  21. iterator() {
  22. pointer = nullptr;
  23. }
  24. iterator(Node<T>* node) {
  25. pointer = node;
  26. }
  27. iterator(const iterator& it) {
  28. pointer = it.pointer;
  29. }
  30.  
  31. iterator& operator=(const iterator& it) {
  32. pointer = it.pointer;
  33. return *this;
  34. }
  35.  
  36. bool operator==(const iterator& it) const {
  37. return pointer == it.pointer;
  38. }
  39.  
  40. bool operator!=(const iterator& it) const {
  41. return pointer != it.pointer;
  42. }
  43. iterator& operator++() {
  44. if (pointer->right) {
  45. pointer = pointer->right;
  46. while (pointer->left) {
  47. pointer = pointer->left;
  48. }
  49. }
  50. else {
  51. Node<T>* before;
  52. do {
  53. before = pointer;
  54. pointer = pointer->parent;
  55. } while (pointer && before == pointer->right);
  56. }
  57. return *this;
  58. }
  59. iterator& operator++(int) {
  60. iterator old(*this);
  61. ++(*this);
  62. return old;
  63. }
  64.  
  65. iterator& operator--() {
  66. if (pointer->left) {
  67. pointer = pointer->left;
  68. while (pointer->right) {
  69. pointer = pointer->right;
  70. }
  71. }
  72. else {
  73. Node* before;
  74. do {
  75. before = pointer;
  76. pointer = pointer->parent;
  77. } while (pointer && before == pointer->left);
  78. }
  79. return *this;
  80. }
  81.  
  82. iterator operator--(int) {
  83. iterator old(*this);
  84. --(*this);
  85. return old;
  86. }
  87.  
  88.  
  89.  
  90. T& operator*() const {
  91. return pointer->value;
  92. }
  93.  
  94.  
  95. };
  96.  
  97.  
  98. Node<T>* insert_private(Node<T>* node, const T& value);
  99. bool empty_private(Node<T>* node) {
  100. return node == nullptr ? true : false;
  101. }
  102. Node<T>* remove_min(Node<T>* node) {
  103. Node<T>* current = node;
  104. while (current->left != nullptr) {
  105. current = current->left;
  106. }
  107. return current;
  108. }
  109.  
  110. Node<T>* remove(Node<T>* node, const T& value);
  111.  
  112. public:
  113. set() {
  114. this->node_ = nullptr;
  115. }
  116. ~set() {
  117. while (!this->empty()) {
  118. this->node_ = remove(this->node_, this->node_->value);
  119. }
  120. }
  121.  
  122. template<typename It>
  123. set(It begin, It end) {
  124. for (auto it = begin; it != end; it++) {
  125. insert(*it);
  126. }
  127. }
  128. void remove_element(const T& value) {
  129. remove(this->node_, value);
  130. }
  131. set(const set& tr) {
  132. *this = tr;
  133. }
  134. void insert(const T& value) {
  135. node_ = insert_private(node_, value);
  136. }
  137. iterator min_element()const {
  138. Node<T>* leftest = node_;
  139. while (leftest->left) {
  140. leftest = leftest->left;
  141. }
  142. return iterator(leftest);
  143. }
  144. iterator max_element() const {
  145. Node<T>* rightest = node_;
  146. while (rightest->right) {
  147. rightest = rightest->right;
  148. }
  149. return iterator(rightest);
  150. }
  151. iterator begin() {
  152. return min_element();
  153. }
  154. iterator begin() const {
  155. return min_element();
  156. }
  157. iterator end() {
  158. return ++max_element();
  159. }
  160. iterator end() const {
  161. return ++max_element();
  162. }
  163.  
  164. bool empty() {
  165. return empty_private(this->node_);
  166. }
  167.  
  168.  
  169. size_t size() const {
  170. return size_;
  171. }
  172. bool operator<(const set& rhs) const {
  173. if (this->size() != rhs.size()) {
  174. return this->size_ < rhs.size() ?true : false;
  175. }
  176. auto it1 = this->begin();
  177. auto it2 = rhs.begin();
  178. for (int i = 0; i < size_; i++) {
  179. return *it1 < *it2;
  180. }
  181. }
  182. bool operator>(const set& rhs) const {
  183. if (this->size() != rhs.size()) {
  184. return this->size_ > rhs.size() ? true : false;
  185. }
  186. auto it1 = this->begin();
  187. auto it2 = rhs.begin();
  188. for (int i = 0; i < size_; i++) {
  189. return *it1 > *it2;
  190. }
  191. }
  192.  
  193. private:
  194. Node<T>* node_;
  195. size_t size_;
  196. };
  197.  
  198. template<typename T>
  199. inline Node<T>* set<T>::insert_private(Node<T>* node, const T & value)
  200. {
  201. Node<T>** current = &node;
  202. Node<T>* parent = nullptr;
  203. while (*current != nullptr) {
  204. parent = *current;
  205. if (value < (*current)->value) {
  206. current = &(*current)->left;
  207. }
  208. else if (value > (*current)->value) {
  209. current = &(*current)->right;
  210. }
  211. else {
  212. return node;
  213. }
  214. }
  215. *current = new Node<T>(value, parent);
  216. (*current)->left = nullptr;
  217. (*current)->right = nullptr;
  218. size_++;
  219. return node;
  220. }
  221.  
  222. template<typename T>
  223. inline Node<T>* set<T>::remove(Node<T>* node, const T & value)
  224. {
  225. if (node == nullptr) {
  226. return node;
  227. }
  228. if (value < node->value) {
  229. node->left = remove(node->left, value);
  230. }
  231. else if (value > node->value) {
  232. node->right = remove(node->right, value);
  233. }
  234. else {
  235. size_--;
  236. if (node->left == nullptr && node->right == nullptr) {
  237. Node<T>* temp = node;
  238. node = nullptr;
  239. delete temp;
  240. }
  241. else if (node->left == nullptr) {
  242. Node<T>* temp = node->right;
  243. *node = *temp;
  244. delete temp;
  245.  
  246. }
  247. else if (node->right == nullptr) {
  248. Node<T>* temp = node->left;
  249. *node = *temp;
  250. delete temp;
  251. }
  252. else {
  253. Node<T>* temp = remove_min(node->right);
  254. node->value = temp->value;
  255. node->right = remove(node->right, temp->value);
  256. }
  257. }
  258. }
  259.  
  260. }
Add Comment
Please, Sign In to add comment