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() 隊尾插入priority_queuefront() 返回隊頭元素
back() 返回隊尾
pop() 彈出隊頭
沒有clear() 操作
清空的時候,直接重新構造就行了 q = queue();
// 優先佇列,堆,預設是大根堆
小根堆的時候,直接插入負數,就可以變成小根堆 (黑科技stack直接定義成小根堆
priority_queue,greater> heap;
// 棧
o1deque
// 雙端佇列,隨機訪問
加強版的 vector,有clear,支援隨機定址,速度很慢(一般不用,太慢了set , multiset(可以插入重複元素),front()
back()
push_back()
push_front()
pop_back(),pop_front()
log nmap,multimap不能插入重複元素(插入的話,會被忽略掉
insert()
find() // 如果不存在,返回end的迭代器
count() 返回某乙個數的個數
erase()
(1) ,輸入乙個數x,刪除所有的 x o(k + logn)
(2),輸入乙個迭代器
lower_bound() 返回大於等於 x 的最小的數
upper_bound() 返回 大於 x 的最小的數
不存在的話,返回end()
// 平衡樹,基於平衡二叉樹(紅黑樹 (平衡二叉樹的一種)),hash
動態維護乙個有序序列
全是log n,包括 ++,--unordered_set,unodered_map,unordered_multiset,unordered_multimap // 基於hash表insert(x) 插入的數,是乙個pair
erase() 輸入的引數,是pair或者迭代器
find()
//像陣列一樣,用map,時間複雜度是 o(log n)
lower_bound,upper_bound
和上面都是類似的,絕大多數操作都是 o(1) 的,都是無序的,
不支援 upper_bound,lower_bound
bitset// 壓位,
例如 1024 bool 位元組 需要 1024b = 1kblist // 鍊錶,用的不多比正常的 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 位取反
參考《演算法筆記》
《演算法競賽入門經典》
《演算法競賽高階指南》
常用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小明有乙個書架,但是他卻用它放了許多唱片。但是他的習慣很不好,唱片胡亂擺放。於是他決定整理一下...