STL中的部分簡單應i用包括棧(stack)、隊列(queue)、其中隊列還有特殊的優先隊列(priority_queue);還有vector-動態數組、其次還有sort排序以及生成排序等多種排序方法,其中包括upper_bound和lower_bound的尋址排序法方便返回特定元素的第一個位置。其次還有set和multiset 與map和multimap等簡單應用問題。ios
首先介紹一下棧、隊列、以及優先隊列、動態數組的共同點與不一樣點:web
咱們先來認識一下棧(stack):
棧是一種先進後出的數據結構,相似於只有出入口相同的一個線性排列,可是一端封閉,只有入口處(即最頂端)能夠進行移除等操做。
隊列queue相似於棧,可是它是一種先進先出的數據結構,即一個入口,一個出口,互不相通,入口只能輸入數據,不負責輸出,出口處與之相似,只負責輸出,即從底端加入元素,但從頂端輸出。
優先隊列與隊列更加接近,基本輸入輸出結構與隊列相似,但輸出元素順序有所限定,能夠默認爲優先隊列(priority_queue)擁有權值觀念,挑三揀四,它會自動依照元素的權值進行排列,權值最高的排在最前面,即權值高者優先輸出,也就是老是彈出鍵值最大元素,所以稱之爲優先隊列。這裏的權值排序輸出其實是利用了pop_heap(max_haep)算法,所以能夠將優先隊列內部看做一個heap。
動態數組(vector),聽名字就好似數組,但出如今這裏,也有部分相似於線性數據結構的性質,便可以經過指定下標對相應元素進行單獨處理,也能夠相似於線性排列對數據元素進行統計,增添,插入,刪除等操做。
初步說明他們之間的一些共性,即頭文件,定義方式,操做等方面都十分類似:
頭文件:
#include<stack/queue/vector>
都要在程序開始前對頭文件進行相應處理。
定義:
stack<data_type> stack_name;
queue <data_type> queue_name;
priority_queue <data_type> priority_queue_name;
vector <data_type> vector_name;
定義出來相似於
stacks;等
更加相似的是操做:
例如在棧中,一系列操做以下:
empty();表示返回bool值,表示棧內是否爲空;
size();表示返回棧內元素的個數;
top();表示返回棧頂元素值;
pop();表示移除棧頂元素;
push(date_type a);表示想站定壓入一個元素;
固然程序執行時的狀況要如下面爲準:
數據結構名.操做名();
這樣才能區分操做,不至於致使亂碼;
咱們能夠來看下面的例子:算法
#include <iostream> #include <stack> #include <algorithm> using namespace std; int main() { stack<int>s; s.push(1); s.push(2); s.push(3); cout << "Top: " << s.top() << endl; cout << "Size: " << s.size() << endl; s.pop(); cout << "Size: " << s.size() << endl; if(s.empty()) { cout << "Is empty" << endl; } else { cout << "Is not empty" << endl; } return 0; }
其輸出結果爲:數組
Top: 3 Size: 3 Size: 2 Is not empty
這些操做在隊列中與之相似:
另外在隊列中還有:
front()表示 返回queue內的下一個元素 (q.front() )
back()表示 返回queue內的最後一個元素(q.back() )
這在隊列中比較特有,在優先隊列中也有所不一樣:
q.top()表示返回優先隊列的下一個元素
在vector動態數組中:
push_back(data_type a)表示將元素a插入最尾端
pop_back()表示將最尾端元素刪除
v[i]表示 相似數組取第i個位置的元素(v[0] )
此時的輸入,刪除與棧、隊列略有不一樣。數據結構
另外關於排序問題:
sort:
頭文件: #include
sort(begin, end);
sort(begin, end, cmp);
分爲兩種,第一種是系統默認從小到大對數據元素進行排序,第二種表示自定義排序方式,利用cmp函數進行自定義排序。
例:int num[] = {1,5,6,2,9};
bool cmp(int a, int b)
{
return a > b;
}
即自定義函數類型爲bool型,讀取a,b;返回a>b;
sort(num, num + 5, cmp);
進行如此排序後獲得:
num[] = {9,6,5,2,1};svg
生成排序:
頭文件: #include
bool next_permutation(begin, end);
改變區間內元素的順序,產生下一個排列。
bool prev_permutation(begin, end);
產生前一個排列。
end爲最後一個元素的下一個位置。函數
upper_bound 和 lower_bound:
upper_bound(begin, end, value);
返回>value的元素的第一個位置。
lower_bound(begin, end, value);
返回>=value的元素的第一個位置。
此處的位置在數組中可認爲是數組的下標位置(注意數組下標爲零時的情形)
例:num[] = {1,2,2,3,4,5};
lower_bound(num, num + 6, 2)
獲得:num + 1
upper_bound(num, num + 6, 2)
獲得:num + 3
在這裏咱們也能夠獲得數組中指定元素元素相同的數量以及將其所有輸出的一種方法。
只需利用以下所示方法便可:spa
int *x,*y; int s=1; x = lower_bound(num, num + 6, 2); y = upper_bound(num, num + 6, 2); while(x!=y) { s++; cout<<*x++<<" "; }
利用s進行計數,指針x,y進行輸出便可。指針
另外關於STL的部分應用,如set和multiset 與map和multimap等問題會在接下來的博客中寫到。code