從pbds rope到stl資料結構的奇技淫巧

2021-10-06 02:53:01 字數 3728 閱讀 7909

1. pbds

pbds常用的有雜湊表,平衡樹,以及各種等資料結構。

首先使用pbds都要加上**using namespace __gnu_pbds;**

雜湊表

#include

#include

使用方法

定義:

cc_hash_tablehash1; //拉鍊法處理衝突

gp_hash_tablehash2; //探測法處理衝突(較快)

使用直接hash1[a]=x,類似map。

使用hash1.find(a),查詢乙個鍵值。

平衡樹

#include

#include

使用方法

定義:

tree

, rb_tree_tag, tree_order_statistics_node_update> t;

rb_tree_tag一維可選其他的,但都太慢了。

會去重!

迭代器可以–使用

.insert(乙個元素).erase(乙個元素).order_of_key(乙個元素) //求k在樹中是第幾大.find_by_order(乙個數)//查第幾大是誰.lower_bound() .upper_bound().join(另乙個樹)//要求元素值區間不相交,全大或全小.split(v,b)key小於等於v的元素屬於a,其餘的屬於b

高能使用

自定義類來實現求字首和之類的操作。

tree_order_statistics_node_update這一維是可以自定義結構體的。

首先必須的結構是

template

<

class

node_citr

,class

node_itr

,class

cmp_fn

,class

_alloc

>

struct my_node_update

;

在這個struct裡面要做的就是我們想做的事情啦,新增一些和結點相關的資料,即插入的時候有乙個含有資料的第二維,相當於插入的資料是乙個結構體。

首先肯定要定義乙個合併左結點和右節點資訊的函式,以下為乙個例子。

void

operator()

(node_itr it, node_citr end_it)

可以在函式內部自定義一些方法,如下,相當於在平衡樹上二分。

int

prefix_sum

(int x)

}return ans;

}

在內部主要使用的函式就是.get_l_child() .get_r_child() .get_metadata()

自己定義的時候就可以改為tree, rb_tree_tag, my_node_update> t;

太nb了!

#include

使用定義

__gnu_pbds ::priority_queue, pairing_heap_tag> a;//要加命名空間防衝突

第一維定義資料型別,第二維greater是大根堆,less是小根堆,第三維選擇堆的型別。

堆的型別的選擇

使用合併的時候使用 pairing_heap_tag

做dijisktra的時候使用 thin_heap_tag 用法

.push(乙個元素) .pop() .top() .empty() .clear().modify(乙個迭代器,乙個值).erase(乙個迭代器).join(另外乙個堆)//最nb的功能!.split(pred prd,priority_queue &other)//分成兩個堆,在樹里可能比較好用

2. rope

首先要帶頭檔案#include使用rope還需要帶命名空間using namespace __gnu_cxx;定義方法rope《變數型別》變數名稱複雜度基本都為log

loglo

g級別,據說106

10^6

106的字串只需要不到1mb

1mb1m

b的空間!

用法 在字串和整數型別的儲存應用較廣,在此只講這兩種。

插入s的前n位:insert(int 起始位置, string &s/int *a, int 長度)取子串:substr(int 起始, int 長度)取字元:at(int x)刪除子串:erase(int 起始, int 長度)將rope從pos開始的len個字元用s替代copy(int pos, int len, string &s/int *a)將rope從pos開始的字元用s替代replace(int pos, string &s/int *a);

3. stl

stl奇技淫巧不多,也很常用,不用錯就行了。

set乙個元素只能出現一次

刪除元素之後結構可能發生改變,因此不要邊刪邊跑迭代器。迭代完之後統一刪除。

multiset可以出現多個元素

刪除乙個值,刪除所有等於該值的結點

要只刪除乙個值,就刪除乙個等於該值的指標

mapmap nb!

bitset用法整理,**胡小兔的部落格

foo.size()返回大小(位數)

f11oo.count()返回1的個數

foo.any()返回是否有1

foo.none()返回是否沒有1

foo.set()全都變成1

foo.set(p)將第p + 1位變成1

foo.set(p, x)將第p + 1位變成x

foo.reset()全都變成0

foo.reset(p)將第p + 1位變成0

foo.flip()全都取反

foo.flip(p)將第p + 1位取反

foo.to_ulong()返回它轉換為unsigned long的結果,如果超出範圍則報錯

foo.to_ullong()返回它轉換為unsigned long long的結果,如果超出範圍則報錯

foo.to_string()返回它轉換為string的結果

從STL檔案到網格拓撲

stl檔案是什麼 stl檔案是網格檔案的一種格式,分為二進位制和文字兩種型別。具體來講,它定義了一群三角麵片,比如下面是乙個文字的stl示例 solid geometryplusplus facet normal 0.902325 0.430279 0.0258872 outer loop vert...

從資料到資訊到決策

俗話說,忘記歷史就是背叛自己,今天這篇用此做開場再合適不過。這一篇將根據乙個虛擬的故事,來介紹如何通過歷史資料來幫助乙個銷售人員發現規律資訊從而輔助他來做一些決策資訊。本文的主角是tim,tim在乙個銷售部門,部門最近決定做新一輪銷售計畫,然後根據計畫結束時,各個銷售人員的銷售業績來進行kpi考核。...

transform從基礎到高階到資料驅動

先來看乙個例子 旋轉 斜切 斜切 大家應該都能看的明白,這是用最原始的方法來實現動畫。簡單易懂,但是這樣的話我們會寫很多重複的 rotate.style.transform scale 2 這樣的 每個事件內部我們都要寫一遍。一般遇到重複 的時候,就可以考慮下是否可以封裝函式了,我們先從最簡單的引數...