C++ STL rope 可持久化平衡树 (可持久化数组)

官方文档好像 GG 了。

rope 不属于标准 STL,属于扩展 STL,来自 pb_ds 库 (Policy-Based Data Structures)。

基本操作:

#include <ext/rope>  // 头文件
using namespace __gnu_cxx;  // 注意名称空间

rope<int> rp;

int main() {
    rp.push_back(x); // 在末尾插入 x
    rp.insert(pos, x); // 在 pos 处插入 x
    rp.erase(pos, x); // 在 pos 处删除 x 个元素
    rp.length(); // 返回 rp 的大小
    rp.size(); // 同上
    rp.replace(pos, x); // 将 pos 处的元素替换成 x
    rp.substr(pos, x); // 从 pos 处开始提取 x 个元素
    rp.copy(pos, x, s); // 从 pos 处开始复制 x 个元素到 s 中
    rp[x]; // 访问第 x 个元素
    rp.at(x); // 同上
    return 0;
}

rope 内部是块状链表实现的,黑科技是支持 \(O(1)\) 复制,而且不会空间爆炸 (rope 是平衡树,拷贝时只拷贝根节点就行)。因此可以用来做可持久化数组。

拷贝历史版本的方式:

rope<int> *his[100000];
his[i] = new rope<int> (*his[i - 1]);

缺点是常数大 (C++ STL 的通病)。

还有一个叫 crope 的东西,crope 即 rope,可以用 cin/cout 直接输入输出,常用于字符串操作。

原文地址:https://www.cnblogs.com/wulitaotao/p/11618785.html

时间: 2024-11-09 02:52:35

C++ STL rope 可持久化平衡树 (可持久化数组)的相关文章

[rope大法好] STL里面的可持久化平衡树--rope

简单用法: #include <ext/rope> using namespace __gnu_cxx; int a[1000]; rope<int> x; rope<int> x(a,a + n); rope<int> a(x); x->at(10); x[10]; x->push_back(x) // 在末尾添加x x->insert(pos,x) // 在pos插入x x->erase(pos,x) // 从pos开始删除x个

洛谷P3835 【模板】可持久化平衡树

题目背景 本题为题目 普通平衡树 的可持久化加强版. 数据已经经过强化 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多个相同的数,因输出最小的排名) 查询排名为x的数 求x的前驱(前驱定义为小于x,且最大的数,如不存在输出-2147483647) 求x的后继(后继定义为大于x,且最小的数,如不存在

Luogu P3835 【模板】可持久化平衡树

P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入\(x\)数 删除\(x\)数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询\(x\)数的排名(排名定义为比当前数小的数的个数\(+1\).若有多个相同的数,因输出最小的排名) 查询排名为x的数 求\(x\)的前驱(前驱定义为小于\(x\),且最大的数,如不存在输出\(-2

【模板】可持久化平衡树

题目背景 本题为题目 普通平衡树 的可持久化加强版. 数据已经经过强化 感谢@Kelin 提供的一组hack数据 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多个相同的数,因输出最小的排名) 查询排名为x的数 求x的前驱(前驱定义为小于x,且最大的数,如不存在输出-2147483647) 求x的后

可持久化平衡树详解及实现方法分析

目录 前置要求 核心思想 实现方法比较:指针 与 数组模拟指针 Merge 是否应该新建节点 参考程序 前置要求 带旋转的平衡树会改变祖先关系,这令可持久化变得困难.所以需要使用非旋的平衡树,如非旋treap.本文以非旋treap为例. 核心思想 可持久化的数据结构,其核心都是不改变历史的信息.当需要对信息进行修改的时候就新开一个节点,继承历史信息,然后再进行修改. 对于非旋treap来说,主要是对 Split 和 Merge 两个操作进行可持久化.剩下的操作不会对数据产生影响.而考虑到非旋tr

stl rope

rope准确的中文翻译是可持久化平衡树,具牛逼 其貌似不是标准的stl容器,在名称空间__gnu_cxx中 其用起来和string差不多 s.insert(a,b) 在s的第a位插入b(b可为字符串) s.erase(a,b)在s的第a位删除b 输出时直接将s[c]表示s的第c位数 #include<iostream> #include<algorithm> #include<cstdio> using namespace std; using namespace __

【可持久化】可持久化数据结构学习笔记

我终于也要学可持久化了QwQ 膜WJMZBMR论文 ------------ 线 割 分 是 我 >ω< ----------------------– 数据结构的可持久化,就是把一个数据结构的历史状态全都保存下来,从而能够快速查找之前出现过的某个操作的结果.当然这必然会带来很大的时间和空间消耗,因此优越的可持久化都会充分利用数据结构历史状态里的相似部分来减少时间和空间复杂度. 显然有一个很裸的可持久化姿势:对数据结构中的每一个节点内嵌一个数据结构(比如平衡树或者STL里那些东西),然后以时间

好久不见的博客咯!——没有可持久化的可持久化treap

每每想要去了解可持久化treap这个好写好调的东东,然后就发现网上只有一个人的--SymenYang的!在此我必须得把他批判一番--写方法不贴代码是什么心态!而且写出来的是有问题的呀!害人不浅! 好吧说正经事,这个版本的treap名叫可持久化treap却没有可持久化,而是借鉴了可持久化treap中的一些写法.貌似可持久化之后反而难写难调...在这个版本的treap中加入了堆权值来维护树的形状,然后由三种操作--合并(merge),按size拆分(split_size),按值拆分(split_kt

JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系

一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent delivery),默认情况下使用的是持久传输. 可以通过MessageProducer 类的 setDeliveryMode方法设置传输模式: MessageProducer producer = ...; producer.setDeliveryMode(DeliveryMode.PERSISTENT); 持