vector和list的比較熟悉,一個單鏈表,一個雙鏈表(push_pack,insert, erase,list的sort功能(great<int>()),還有算法那個庫)
slist,只能用pushfront()
說明(四)stack#include <deque>deque容器類與vector類似,支持隨機訪問和快速插入刪除,它在容器中某一位置上的操作所花費的是線性時間。與vector不同的是,deque還支持從開始端插入數據:push_front()。(deque雙向隊列是一種雙向開口的連續線性空間,可以高效的在頭尾兩端插入和刪除元素,相當於list和slist,並加入了操作區間)
構造:
deque<Elem> c 創建一個空的deque
deque<Elem> c1(c2) 複製一個deque。
deque<Elem> c(n) 創建一個deque,含有n個數據,數據均已缺省構造產生。
deque<Elem> c(n, elem) 創建一個含有n個elem拷貝的deque
deque<Elem> c(beg,end) 創建一個以[beg;end)區間的deque(beg和end都是地址)
c.~deque<Elem>() 銷燬所有數據,釋放內存
方法:
c.assign(beg,end) 將[beg; end)區間中的數據賦值給c。(這個和構造一樣的)
c.assign(n,elem) 將n個elem的拷貝賦值給c。
c. at(idx) 傳回索引idx所指的數據,如果idx越界,拋出out_of_range。
c.back() 傳回最後一個數據,不檢查這個數據是否存在。
c.begin() 傳回迭代器中的第一個數據。
c.clear() 移除容器中所有數據。
c.empty() 判斷容器是否爲空。
c.end() 指向迭代器中的最後一個數據地址。
c.erase(pos) 刪除pos位置的數據,傳回下一個數據的位置。
c.erase(beg,end) 刪除[beg,end)區間的數據,傳回下一個數據的位置。
c.front() 傳回第一個數據。
get_allocator 使用構造函數返回一個拷貝。
c.insert(pos,elem) 在pos位置插入一個elem拷貝,傳回新數據位置
c.insert(pos,n,elem) 在pos位置插入>n個elem數據。無返回值
c.insert(pos,beg,end) 在pos位置插入在[beg,end)區間的數據。無返回值
c.max_size() 返回容器中最大數據的數量。
c.pop_back() 刪除最後一個數據。
c.pop_front() 刪除頭部數據。
c.push_back(elem) 在尾部加入一個數據。
c.push_front(elem) 在頭部插入一個數據。
c.rbegin() 傳回一個逆向隊列的第一個數據。
c.rend() 傳回一個逆向隊列的最後一個數據的下一個位置。
c.resize(num) 重新指定隊列的長度。
c.size() 返回容器中實際數據的個數。
c.swap(c2)
swap(c1,c2) 將c1和c2元素互換。
pop, push,top(棧頂的元素值,而且可以用)
stack<int> st;
st.push(2);
printf("%d",st.top());
(五) queue
這個是一個真實單向隊列,前進後出
(六)heap四個基本函數make_heap();、pop_heap();、push_heap();、sort_heap();
void make_heap(first_pointer,end_pointer,compare_function);//point=iterator
作用:把這一段的數組或向量做成一個大根堆的結構(根據完全二叉樹來決定位置,a[0]爲根節點,a[1]爲左節點,以此類推)
void pop_heap(first_pointer,end_pointer,compare_function);
作用:pop_heap()不是真的把最大(默認)的元素從堆中彈出來。而是重新排序堆。它
把first和last交換,然後將[first+1,last)的數據再做成一個堆。
void sort_heap(first_pointer,end_pointer,compare_function);
作用是sort_heap對[first,last)中的序列進行排序。它假設這個序列是有效堆。(當然
,經過排序之後就不是一個有效堆了);從小到大排序
void
push_heap(value);//插入最後的位置,然後比較重排,比如前面已經有六個元素,插入到第七個位置,然後進行大堆排序,一層一層往上比較、替換,最終得到最好的的結果
(七)priority_queue
#include <queue>
priority_queue<int, vector<int>, greater<int> > q;
當<與<緊挨着,<與<之間要加空格(>類似),否則會編譯錯誤!!!
但是其top()/pop()的對象並非第一個置入的元素,而是優先級最高的元素。
換句話說,Priority Queue內的元素已經跟去其值和排序準則進行了排序。
優先最高的是由大小定義的,如果沒有greater,就默認從大到小,不然就從小到大
相當於堆
(八)set,multiset,hash_setset確實是集合,除了assign的方法等等以外,還有
//交集
set_intersection( S.begin(), S.end(),
S2.begin(), S2.end(),
inserter( Si, Si.begin() ) );
//並集
set_union( S.begin(), S.end(),
S2.begin(), S2.end(),
inserter( Su, Su.begin() ) );
//差集,S-S2
set_difference( S.begin(), S.end(),
S2.begin(), S2.end(),
inserter( Sd, Sd.begin() ) );
//對稱差集,S、S2中相互沒有的元素
set_symmetric_difference( S.begin(), S.end(),
S2.begin(), S2.end(),
inserter( Ssd, Ssd.begin() ) );
set<int, less<int> >::key_compare kc1 = s1.key_comp( ) ;
bool result1 = kc1( 2, 3 ) ;
if( result1 == true )
const int N = 5;int cmp(int a,int b) {return a > b;}int main(){int a[N] = {4,3,2,6,1};sort(a,a+N,cmp);//自定義以排序return 0;}
自動排序,紅黑樹,最快
(九)map,multimap
一個key一個value,查找key都可以,可填入pair的一對,還可以排序等等,multimap可以重複