stl容器學習目錄

vector和list的比較熟悉,一個單鏈表,一個雙鏈表(push_pack,insert, erase,list的sort功能(great<int>()),還有算法那個庫)

slist,只能用pushfront()


(三)deque容器(雙端隊列)
說明

#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元素互換。
(四)stack
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;
當<與<緊挨着,<與<之間要加空格(>類似),否則會編譯錯誤!!!

Priority Queue中的元素根據優先級被讀取,它的接口和queue非常相近
但是其top()/pop()的對象並非第一個置入的元素,而是優先級最高的元素。

換句話說,Priority Queue內的元素已經跟去其值和排序準則進行了排序。

優先最高的是由大小定義的,如果沒有greater,就默認從大到小,不然就從小到大

相當於堆

(八)set,multiset,hash_set

set確實是集合,除了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() ) );

        

lower_bound() 返回指向大於(或等於)某值的第一個元素的迭代器
key_comp() 返回一個用於元素間值比較的函數,
使用方法
set <int, less<int> > s1;
set<int, less<int> >::key_compare kc1 = s1.key_comp( ) ;
bool result1 = kc1( 2, 3 ) ;
if( result1 == true )   
set所有的操作的都是嚴格在logn時間之內完成,效率非常高。set和multiset的區別是:set插入的元素不能相同,但是multiset可以相同。hash_set在時間性能上比set要好一些
從大到小排序(需要自己寫comp函數)
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可以重複

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章