首页 > 其他分享 >rope 简要介绍

rope 简要介绍

时间:2023-04-03 21:26:58浏览次数:45  
标签:__ 简要 string iterator 介绍 rope basic mathcal

rope

rope 是 c++ __gnu_pbds 里的一个 STL,实现是可持久化平衡树。

enum { _S_max_rope_depth = 45 };
static const unsigned long _S_min_len[_RopeRep::_S_max_rope_depth + 1];// 斐波那契数列
static bool _S_is_balanced(_RopeRep* __r)
{ return (__r->_M_size >= _S_min_len[__r->_M_depth]); }
static bool _S_is_almost_balanced(_RopeRep* __r)
{ return (__r->_M_depth == 0 ||	__r->_M_size >= _S_min_len[__r->_M_depth - 1]); }

为了和 rope 作比较,复习一下 basic_stringbasic_string 采用的方法是储存连续内存,每次扩容两倍来实现动态开空间,另外附带了小字符串优化和期望空终止。此则 basic_string 之大观也,前人之述备亦。

优势

  • rope 中间插入或删除字符串的复杂度是 \(\mathcal O(\log n)\),优于 basic_string 的 \(\mathcal O(n+|s|)\)(这里的 \(n\) 与到 basic_string 结尾的距离成正比)。
  • rope 节省空间。复制时直接把原 rope 使用引用计数快速来避免复制,之后就算对原串还是现串进行一些修改也无伤大雅。
  • 在末尾连接两个 rope 只需要 \(\mathcal O(1)\) 的复杂度,而且不会读取原串(目前这一功能的实现还不完整)。就算对 basic_string 进行启发式合并,复杂度也是均摊 \(\mathcal O(\log n)\) 的,在扩容时会涉及到读取原串。

劣势

  • 随机访问以及单点修改的复杂度是 \(\mathcal O(\log n)\),不如 basic_string 的 \(\mathcal O(1)\)。
  • 使用 const_iterator 遍历的复杂度是每次均摊大常数 \(\mathcal O(1)\),使用 iterator 遍历时修改会更慢。所以成员函数 begin end 返回的是 const_iterator 而不是 iteratorbasic_string 是严格 \(\mathcal O(1)\)。
  • rope const_iterator 的大小在 \(64\) 位机子是 \(152\) 字节,而 iterator 是 \(160\) 字节,远大于 basic_string iterator 的 \(8\) 字节。

成员函数

rope 具有 Container,(几乎)Sequence,Reversible Container,Front Insertion Sequence,Back Insertion Sequence, Forward Container 的性质,也具有这些具有的成员函数。
不过不推荐把 rope 真的当成 Sequence 然后疯狂底层访问,这会使 rope 变慢,应该使用各种内置的函数。
各种成员函数的表可以看这里:https://web.archive.org/web/20121225183151/http://www.sgi.com/tech/stl/Rope.html。

常见套路

  • 用来作为可持久化平衡树,\(\mathcal O(\log n)\) 的插入删除与 \(\mathcal O(1)\) 的可持久化。
  • rope 同时维护正序和倒序,交换时直接把需要交换的那两段进行交换。

标签:__,简要,string,iterator,介绍,rope,basic,mathcal
From: https://www.cnblogs.com/bxjz/p/rope.html

相关文章

  • MySQL索引详细介绍
    一、什么是索引?为什么要建立索引?索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很......
  • 人工智能运用--我的银行大众客户存款增长预测模型介绍(2)
     特征处理的实现代码如下:#先对年龄缺失值进行处理,这里先按28岁填充处理客户年龄,因为年龄基本服从正态分布,初步考虑分为0-20,20-30,30-40,40-50,50-60,70-80,80-100分别标记为age_class1,......,age_class8'''Train['NTRL_CUST_AGE']=Train['NTRL_CUST_AGE'].fillna(28)Sex_OneHo......
  • HCIP-ICT实战进阶12-接入安全技术介绍
    HCIP-ICT实战进阶12-接入安全技术介绍HCIP最后一篇理论博客了,这个搞完我再考虑要不要把系统集成也整一份博客,还是把HCIP实验的博客整理整理,这学期争取去国科那边接接项目吧.0前言在这篇博客中,我将介绍常见的以太网交换安全技术,包括端口隔离、端口安全、MAC地址表安......
  • docker 网络介绍
     版权声明:本文为CSDN博主「逆袭的小学生」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/q610376681/article/details/90483576 上面我们只运行了nginx,并没有用浏览器进行访问,这里我们尝试用浏览器访问,但是之前我......
  • Flask 和pythonweb框架介绍、flask快速使用、登录,显示用户信息小案例、配置文件方式、
    Flask和pythonweb框架介绍、flask快速使用、登录,显示用户信息小案例、配置文件方式、路由系统Flask和pythonweb框架介绍Flask和pythonweb框架的区别:Django框架: 大而全,内置的app很多,第三方的app很多Flask框架: 小而精,没有过多的内置app,只能完成web框架的基本功能,很多功能......
  • myBatis报错org.apache.ibatis.ognl.NoSuchPropertyException
    跑批任务时mybatis报错org.apache.ibatis.ognl.NoSuchPropertyException,重跑未出现报错,百度发现是由于mybatis依赖的Ognl版本OgnlRuntime.getMethodValue在并发情况下会存在并发问题,错误地返回null引起报错 以下是搜索该问题时找到的资料:https://github.com/1993hzh/tho......
  • 1 Flask 和pythonweb框架介绍、2 flask快速使用 、3 登录,显示用户信息小案例、4 配置
    目录1Flask和pythonweb框架介绍1.1flask介绍2flask快速使用3登录,显示用户信息小案例3.1login.html3.2home.html3.3detail.html3.4py文件4配置文件方式5路由系统5.1路由本质5.2路由参数add_url_rule5.3转换器1Flask和pythonweb框架介绍#pythonweb框架,本质都一......
  • redis介绍
         ......
  • Flask 和pythonweb框架介绍、flask快速使用、登录,显示用户信息小案例、配置文件方式、
    目录1Flask和pythonweb框架介绍1.1flask介绍2flask快速使用3登录,显示用户信息小案例3.1login.html3.2home.html3.3detail.html3.4py文件4配置文件方式5路由系统5.1路由本质5.2路由参数add_url_rule5.3转换器1Flask和pythonweb框架介绍#pythonweb框架,本质都一......
  • 介绍一下requestAnimationFrame和requestIdleCallback
    当我们需要执行动画或其他高性能操作时,常常会遇到以下问题:-任务的执行频率过高,对CPU和内存造成了大量的压力。-任务的优先级较高,导致其他任务无法及时得到处理。为了解决这些问题,JavaScript提供了两个调度API:requestAnimationFrame和requestIdleCallback。 request......