常用 STL 整理

2022-01-16 19:07:01 字數 4016 閱讀 5698

vector

可變長陣列,變長是基於倍增的思想

系統為某乙個程式分配空間時,有乙個特點,

他所需的時間基本上與空間大小無關,只與申請次數有關

(即 100 和 1000 沒區別,只和請求次數有關)

因此,vector的優化目標是,減少申請的次數(優化時間,可以浪費空間)

起初先申請乙個 小的空間(例如32),當我們插入到邊界的時候,就會申請到 64個空間

然後把 原來的32個元素copy過來,(每一次陣列長度不夠的時候,就把陣列的長度*2,再把原來的

元素copy過來。

假設要申請 n 的陣列,起初為 1 ,我們一共會copy 1 + 2 + 4 + 8....+5*10^5 == 10^6 ,

因此大概copy的操作是 10^6 ,均攤下來, 尾部插入的操作就是\(o(1)\) 的,隨機插入是\(o(n)\)

初始化
vectorname;

vectora(n); // 初始化大小為n的陣列,0~n-1

vectora(n,3); //初始化大小為n的陣列,所有值均為3

vector> name; // 定義二維的vector,兩維都能動態變長

vecotra[n]; // 第一維已經固定,第二維才是vector

訪問

(1) 通過下標隨機訪問 範圍是 0 ~ size() - 1

(2) 通過迭代器訪問 iterator (類似於指標)

vector::iterator it;

通過 *it 來訪問元素//支援++,--

常用函式
push_back(); // 尾端插入 o(1)

pop_back(); // 尾端刪除 o(1)

size(); // 返回元素個數 o(1) ,返回的是 unsigned 型別

clear(); // 虛假的清空 不能真正的清空元素個數,放棄使用,直接新定義乙個重名的,當做清空

v = vector(); // 真正的清空

insert(it,x); // 在迭代器 it 處,插入乙個元素 x, o(n)

erase();// 刪除單個元素 o(n)

erase(v.begin(),v.end());// 刪除區間的元素 o(n)

// 支援比較運算,按字典序來比較

pair

可以看作乙個內部有兩個元素的結構體,元素型別任意指定

初始化

pairp;// typename 可以為任意型別

pair> p; // pair支援多重巢狀

//臨時構造pair

p = make_pair("123",123);

p = ; // c++ 11 寫法

訪問
p.first; // 第乙個關鍵字

p.second; // 第二關鍵字

用途

1.支援比較運算,排序的時候,以first為第一關鍵字,second為第二關鍵字

2.用來代替二元結構體及其建構函式

3.作為map的鍵值對來進行插入

string

c++ 封裝好的字串

初始化

string s = "123";
訪問
c_str() 可以返回 string 型別的字串儲存的起始位址

通過迭代器訪問 string::iterator it;

s[i]; // 像陣列一樣訪問

常用函式
size() 與 length() 基本相同,o(1);

支援字典序比較 <=,<,>=,>....

insert(pos,string);// 在pos位置,插入string字串 o(n)

erase();// o(n)

substr(pos,len); // 返回從 pos 開始,長度為 len 的字串 o(len)

str1.find(str2); // 返回str2 在 str1 中第一次出現的位置,如果沒有出現,返回 npos o(n^2)

string::npos;// 是乙個常數 -1

replace(); // 區間替換字串

+ // 拼接

queue

queue , push(),pop(),front()

push() 隊尾插入

front() 返回隊頭元素

back() 返回隊尾

pop() 彈出隊頭

沒有clear() 操作

清空的時候,直接重新構造就行了 q = queue();

priority_queue

// 優先佇列,堆,預設是大根堆

小根堆的時候,直接插入負數,就可以變成小根堆 (黑科技

直接定義成小根堆

priority_queue,greater> heap;

stack

// 棧

o1

deque

// 雙端佇列,隨機訪問

加強版的 vector,有clear,支援隨機定址,速度很慢(一般不用,太慢了

front()

back()

push_back()

push_front()

pop_back(),pop_front()

set , multiset(可以插入重複元素),
log n

不能插入重複元素(插入的話,會被忽略掉

insert()

find() // 如果不存在,返回end的迭代器

count() 返回某乙個數的個數

erase()

​ (1) ,輸入乙個數x,刪除所有的 x o(k + logn)

​ (2),輸入乙個迭代器

lower_bound() 返回大於等於 x 的最小的數

upper_bound() 返回 大於 x 的最小的數

不存在的話,返回end()

map,multimap

// 平衡樹,基於平衡二叉樹(紅黑樹 (平衡二叉樹的一種)),hash

動態維護乙個有序序列

全是log n,包括 ++,--

insert(x) 插入的數,是乙個pair

erase() 輸入的引數,是pair或者迭代器

find()

//像陣列一樣,用map,時間複雜度是 o(log n)

lower_bound,upper_bound

unordered_set,unodered_map,unordered_multiset,unordered_multimap // 基於hash表

和上面都是類似的,絕大多數操作都是 o(1) 的,都是無序的,

不支援 upper_bound,lower_bound

bitset// 壓位,

例如 1024 bool 位元組 需要 1024b = 1kb

比正常的 bool 陣列省 8 位記憶體,

bitset利用了每一 個 bit

bitset<1000> s;

count() 返回有多少個 1

any() 返回是否至少有乙個 1

none() 是否全為空

set() 把所有 位 置為 1

set(k,v) 將第k位,變成 v

reset() 把所有位 變成 0

flip() 等價於 ~

flip(k) 是把 第 k 位取反

list // 鍊錶,用的不多

參考《演算法筆記》

《演算法競賽入門經典》

《演算法競賽高階指南》

常用STL整理 施工中 2017 8 11更新

1.vector 構造vector v 基本操作 v.begin 指向迭代器中第乙個元素。v.end 指向迭代器中末端元素的下乙個,指向乙個不存在元素。v.push back elem 在尾部加入乙個資料。v.pop back 刪除最後乙個資料。v.capacity vector可用空間的大小。v....

STL 簡單整理

stl include multisetnum 定義 multiset iterator it 迭代器 num.insert b 插入 num.erase num.find b 刪除 查詢 num.erasr pos pos位資料 num.erasr beg,end 區間刪除 num.count b...

STL 整理唱片

problem g stl 整理唱片time limit 1 sec memory limit 128 mbsubmit 6303 solved 1778 submit status description小明有乙個書架,但是他卻用它放了許多唱片。但是他的習慣很不好,唱片胡亂擺放。於是他決定整理一下...