1. 程式人生 > 其它 >c++自帶可持久化平衡樹

c++自帶可持久化平衡樹

宣告:

C++11及以後開始支援

可以當作可持久化平衡樹使用,內部構造是一個塊狀連結串列

(1)標頭檔案

#include<ext/rope>

(2)呼叫名稱空間

using namespace __gnu_cxx;

(3)宣告使用

rope<int>Irp;

rope<long long>Lrp;

crope crp;//相當於定義成rope<char>,即定義為string型別

rope<char>rop;

rope<double>Drp;

//rope<PII>Prp;不合法

支援的操作

push_back(x);      在末尾新增x

insert(pos,x);      在pos插入x

erase(pos,x);      從pos開始刪除x個

replace(pos,x);      從pos開始換成x

substr(pos,x);      提取pos開始x個
 
at(x)
/[x]; 訪問第x個元素 test.clear(); 清空元素

char型別的rope

insert(int pos, string &s, int n);

將字串s的前n位插入rope的下標pos處

append(string &s,int pos,int n);

把字串s中從下標pos開始的n個字元連線到rope的結尾,如沒有引數n則把字串s中下標pos後的所有字元連線到rope的結尾,如沒有引數pos則把整個字串s連線到rope的結尾

substr(int pos, int len);

提取rope的從下標pos開始的len個字元

at(int x);

訪問rope的下標為x的元素

erase(int pos, int num);

從rope的下標pos開始刪除num個字元

copy(int pos, int len, string &s);

從rope的下標pos開始的len個字元用字串s代替,如果pos後的位數不夠就補足

replace(int pos, string &x);

從rope的下標pos開始替換成字串x,x的長度為從pos開始替換的位數,如果pos後的位數不夠就補足

int n, m;
char a[N];
rope<char>r;
int main()
{
    
for(int i = 0; i <= 10; ++ i) a[i] += i +'0'; r.insert(0, a + 2, 8); for(int i = 0; i <= 10; ++ i) cout << r.at(i) << " "; puts(""); for(int i = 0; i <= 10; ++ i) cout << r[i] << " "; puts(""); return 0; }
2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9

int型別的rope

insert(int pos, int *s, int n);

將int陣列(以下的s都是int陣列)s的前n位插入rope的下標pos處,如沒有引數n則將陣列s的所有位都插入rope的下標pos處

append(int *s,int pos,int n);

把陣列s中從下標pos開始的n個數連線到rope的結尾,如沒有引數n則把陣列s中下標pos後的所有數連線到rope的結尾,如沒有引數pos則把整個陣列s連線到rope的結尾

substr(int pos, int len);

提取rope的從下標pos開始的len個數

at(int x);

訪問rope的下標為x的元素

erase(int pos, int num);

從rope的下標pos開始刪除num個數

copy(int pos, int len, int *s);

從rope的下標pos開始的len個數用陣列s代替,如果pos後的位數不夠就補足

replace(int pos, int *x);

從rope的下標pos開始替換成陣列x,x的長度為從pos開始替換的位數,如果pos後的位數不夠就補足

rope<int>rp;
int main()
{
    rp.append(3);
    rp.append(1);
    rp.append(2);
    rp.append(1);
    rp = rp.substr(1, 3);//從1開始截3個數字,注意rope是從0開始的,所有的容器都是從0開始的
    for(int i = 0; i < rp.size(); ++ i)
        cout << rp[i] << " ";
    puts("");
    return 0;
}
輸出:
1 2 1

具體的細節

時間複雜度:$O(n\sqrt{n})$(因為是用塊狀連結串列實現的)

空間複雜度:$O(\sqrt{n})$​

可持久優化

定義方法

rope<char> *now[p];

如何申請更新一個新的可持久化版本:

now[0]=new rope<char>();

如何繼承版本

now[cnt]=new rope<char>(*now[cnt-1]);

如何回到查詢過去的版本

ans=now[cnt]->at(num);