当前位置: 首页 > news >正文

网站平台推广上海网站关键字优

网站平台推广,上海网站关键字优,今天郑州最新新闻,网址导航的意思文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- -operator[ ] map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pairk,v的rb_tree rb_tree的Key和Value不是我们之前传统意… 文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- -operator[ ] map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pairk,v的rb_tree rb_tree的Key和Value不是我们之前传统意义上的key/value 迭代器也是一份模版实例化出两个不同的迭代器 所以说底层上红黑树是有两份的一份是key的一份是key/value的 通过泛型的思想实现出的模版第二个参数不是写死的第二个模版参数是Value决定的Value可以是key或者是pairconst key, T,这样既可以实现key的搜索场景也可以实现key/value的搜索场景要注意一下源码里面模板参数是用T代表value而内部写的value_type不是我们我们日常key/value场景中说的value源码中的value_type反而是红黑树结点中存储的真实的数据的类型rb_tree的第二个模版参数已经控制了红黑树节点的存储的数据类型为什么还要写第二个模版参数 set的两个模版参数都是一样的,都是key,insert的都是key,find和erase的也是key。但是对于map来说insert的是pair对象find/erase的是key。所以set为了兼容map就传了两个模版参数 map和set的模拟实现 pair的默认比较的是firstfirst小就小first不小比较second,second小就小。 insert insert关键是要解决插入的值是Key还pair的问题 上层用仿函数实现一个类来解决下层比较的是key还是pair的问题下层不知道T是什么但是上层知道如果比较的是key上层就传key,是pair就传pair namespace wbc {templateclass Kclass set{// 为了解决不知道下层T是key还是pair的逻辑struct SetKeyOfT{// 仿函数可以解决const K operator()(const K key){return key;}};public:bool insert(const K key){return _t.Insert(key);}private:RBTreeK,K,SetKeyOfT _t;}; }namespace wbc {templateclass K, class Vclass map{// 为了解决不知道下层T是key还是pair的逻辑struct MapKeyOfT{// 仿函数可以解决const pairK, V operator()(const pairK, V kv){return kv.first;}};private:RBTreeK, pairK, V,MapKeyOfT _t;}; }iterator实现的思路 map和set的迭代器走的是中序遍历begin()返回的是中序的第一个节点operator核心是不看全局只看局部只关心当前局部的下一个节点是什么中序访问的顺序左子树根右子树。it当前节点已经访问完了如果右不为空访问右子树的最左节点。如果右为空说明当前节点已经访问完了子树也访问完了就要访问该节点的祖先并且要往上找。要找的是孩子是祖先的左边的那个祖先。 如果孩子在父亲的右说明父亲访问完了父亲在爷爷的左下一个就访问爷爷。set的iterator也不支持修改我们把set的第二个模板参数改成const K即可 RBTreeK,const K, SetKeyOfT _t;map的iterator不支持修改key但是可以修改value我们把map的第二个模板参数pair的第一个参 数改成const K即可 RBTreeK, pairconst K, V,MapKeyOfT _t; operator 右不为空中序的下一个节点就是右子树中的最左节点右为空分为两种情况 情况1一直往上找直到找到父亲的左是当前节点那么下一个节点就是这个父亲节点 情况2就是一直找找不到父亲的左是当前节点也就是当前节点一直是父亲的右直到找到父亲是空都没有找到那么这棵树就走完了 Self operator() {if (_node-_right){// 如果右不为空,中序下一个要访问的节点就是最左(最小)节点Node* min _node-_right;while (min-_left){min min-_left;}_node min;}else{// 如果右为空,祖先里面的孩子是父亲左的那个祖先Node* cur _node;Node* parent cur-_parent;while (parent cur parent-_right){cur parent;parent cur-_parent;}_node parent;}return *this; }operator- - 访问节点 右子树根左子树。如果左树不为空访问左树的最右节点最大节点。如果左树为空说明这棵子树访问完了如果该节点还是父亲的左说明也访问完了要找到节点是父亲的右下一个访问的节点就是父亲。如果都不存在下一个就要访问空节点了说明这棵树访问完了。operator- - 和operator正好反过来了 // RBTree.h Self operator--() {if (_node nullptr) // --end(){// --end(),找到整棵树的最右节点,中序的最后一个节点// 找最右节点Node* mostright _root;// 空树(无节点)和找最右节点while (mostright mostright-_right){mostright mostright-_right;}_node mostright;}else if (_node-_left){// 如果左不为空下一访问的是左树中的最右节点Node* most _node-_left;while (most-_right){most most-_right;}_node most;}else{// 如果左为空,下一个访问的是孩子是父亲右的,那个祖先Node* cur _node;Node* parent _node-_parent;while (parent cur parent-_left){cur parent;parent cur-_parent;}_node parent;}return *this; }// Myset.h void Print(const setint s) {setint::const_iterator it s.end();while (it ! s.begin()){--it;cout *it ;}cout endl; }// test.cpp int main() {wbc::setint s;s.insert(5);s.insert(1);s.insert(2);s.insert(3);s.insert(4);s.insert(6);s.Print(s); }库里面实现的是有哨兵位的头节点我们实现是end()是nullptr但是也可以实现–end()的功能无非就是要_root去找整棵树的最右节点最后一个节点end()是最后一个节点的下一个节点 operator[ ] operator[ ]直接调用insert即可 map实现operator[ ],修改insert的返回值为pair Iterator,bool V operator[](const K key) {pairiterator, bool ret insert({ key,V() });return ret.first-second;// 修改value }pairIterator,bool Insert(const T data) {if (_root nullptr){_root new Node(data);_root-_col BLACK;// return pairIterator,bool(Iterator(_root,_root),true);return { Iterator(_root,_root),true }; }KeyOfT kot;Node* parent nullptr;Node* cur _root;while (cur){if (kot(cur-_data) kot(data)){parent cur;cur cur-_right;}else if (kot(cur-_data) kot(data)){parent cur;cur cur-_left;}else{// 不冗余,插入失败return { Iterator(cur,_root),false }; ;}}cur new Node(data);Node* newnode cur;// 如果连续变色,cur不一定是新节点// 如果是非空树,插入红色节点cur-_col RED;if (kot(parent-_data) kot(data)){parent-_right cur;}else if (kot(parent-_data) kot(data)){parent-_left cur;}// 链接父亲节点cur-_parent parent;// parent是红色,出现了连续的红色节点,需要向上调整// 调整之后cur是根,cur的parent是nullptrwhile (parent parent-_col RED){Node* grandfather parent-_parent;if (grandfather-_left parent){// g// p uNode* uncle grandfather-_right;if (uncle uncle-_col RED){// 变色是为了处理连续的红节点,保证黑节点的数量不变,// 向上继续调整是因为grandfather的节点可能是黑节点就结束,// 可能是红节点就继续向上处理parent-_col uncle-_col BLACK;grandfather-_col RED;// 继续向上处理cur grandfather;parent cur-_parent;}else{// uncle不存在或uncle存在且为黑// g// p u// c// 右单旋if (cur parent-_left){RotateR(grandfather);parent-_col BLACK;grandfather-_col RED;}else{// 双旋// g// p u// cRotateL(parent);RotateR(grandfather);cur-_col BLACK;grandfather-_col RED;}break;}}else{// g// u pNode* uncle grandfather-_left;if (uncle uncle-_col RED){parent-_col uncle-_col BLACK;grandfather-_col RED;// 继续向上更新cur grandfather;parent cur-_parent;}else{// uncle不存在或者存在且是黑// g// u p// c// 左单旋if (parent-_right cur){RotateL(grandfather);parent-_col BLACK;grandfather-_col RED;}else{// g// u p// c// 双旋RotateR(parent);RotateL(grandfather);cur-_col BLACK;grandfather-_col RED;}break;}}}// 无论如何结束之后根都是黑色的_root-_col BLACK;return {Iterator(newnode,_root),true}; }
http://www.hkea.cn/news/14333454/

相关文章:

  • 网站图标用代码代替沈阳网站建设工作
  • 深圳比较好网站制作公司有哪些上海的设计网站有哪些
  • 北京企业网站案例设计公司啊 网站
  • 怎么做网页模板展示网站技术型网站做哪一种好
  • 一个空间可以放两个网站吗电子商务网站建设与管理试题及答案
  • 网站建设方案 备案青岛网站建设服务器
  • 网站信息化建设总体情况免费获取资源的公众号
  • 武威市市建设局网站建筑业管理阿里巴巴怎么做企业网站
  • 网站建设套餐介绍北京app制作多少钱
  • 淄博便宜网站设个人网站备案要求
  • 柳州网站建设公司哪家好个人怎么建网站
  • 电脑去哪里建设网站旅游网站开发的目的
  • 胖咯科技网站建设石家庄网站seo服务
  • 网站内容规划流程太和网站开发招聘
  • 邯郸网站制作哪家强ui模板免费下载
  • 深圳网站建设哪家便宜做网站之前要先购买服务器吗
  • asp.net sql server网站建设 pdf免费做简历下载的网站
  • 重庆好的网站建设wordpress cpu负载过高
  • 公司网站建设准备资料园区做网站
  • 东莞市建网站企业信用信息查询公示系统北京
  • 网站中文域名到期用asp做的网站
  • aspnet网站开发视频网站后台无法修改
  • 免费的黄冈网站有哪些平台可以用微信支付磐安网站建设公司
  • 网站开发界面设计工具东莞网站建设公司招聘信息
  • 闽清建设局网站门户网站建设进度
  • 常德市建设局网站郑州网站推广排名
  • 电子商务网站开发与设计网站没被收录
  • cnzz如何查询某个网站频道的流量外网如何查看局域网建设的网站
  • 建设网站个人网上银行wordpress自动加p标签
  • 阿里云网站建设一次付费代驾网站开发