Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <set>
- #include <map>
- #include <iostream>
- #include <cstdlib>
- #include <string>
- using namespace std;
- template<typename T>
- struct Myset{
- private:
- map<T, int> mp;
- typedef _Rb_tree_node<pair<const T, int> > _Node;
- void fix_size(_Rb_tree_node_base * it, bool step_in = true){
- int & it_size = static_cast<_Node *>(it) -> _M_value_field.second;
- it_size = 1;
- if(it -> _M_left != 0){
- if(step_in)fix_size(it -> _M_left, false);
- it_size += static_cast<_Node *>(it -> _M_left) -> _M_value_field.second;
- }
- if(it -> _M_right != 0){
- if(step_in)fix_size(it -> _M_right, false);
- it_size += static_cast<_Node *>(it -> _M_right) -> _M_value_field.second;
- }
- }
- void fix_all_sizes(_Rb_tree_node_base * it, _Rb_tree_node_base * end){
- if(it -> _M_left != 0)fix_size(it -> _M_left);
- if(it -> _M_right != 0)fix_size(it -> _M_right);
- do{
- fix_size(it);
- it = it -> _M_parent;
- }while(it != end);
- }
- public:
- void print()const{
- const _Rb_tree_node_base * it = mp.begin()._M_node;
- while(it -> _M_parent != mp.end()._M_node){
- it = it -> _M_parent;
- }
- print_impl(it, "");
- }
- void print_impl(const _Rb_tree_node_base * it, string indent)const{
- if(it == 0){
- cout << indent << "nil (0)" << endl;
- return;
- }
- cout << indent << static_cast<const _Node *>(it) -> _M_value_field.first;
- cout << " (" << static_cast<const _Node *>(it) -> _M_value_field.second << ")" << endl;
- if(it -> _M_left != 0 || it -> _M_right != 0){
- print_impl(it -> _M_left, indent + " ");
- print_impl(it -> _M_right, indent + " ");
- }
- }
- void insert(const T & t){
- pair<typename map<T, int>::iterator, bool> fit = mp.insert(pair<T, int>(t, -1));
- if(fit.second == false)return;
- fix_all_sizes(fit.first._M_node, mp.end()._M_node);
- }
- };
- int main(){
- Myset<int> st;
- for(int i = 0; i < 30; ++i)st.insert(rand() % 100);
- st.print();
- }
Advertisement
Add Comment
Please, Sign In to add comment