C++之STL
C++的STL
眾所周知C++是一款程式語言,有些天朝OIers把c++稱為c+STL,足以看出STL的重要性.
那什麼是STL,又有哪些STL是我們需要熟練掌握的?
- 什麼是STL
- 常用的STL
- queue
- stack
- vector
- algorithm
- pair( utility )
- 練習題
Part 1 什麼是STL
STL是Standard Template Library的簡稱,中文名標準模板庫,惠普實驗室開發的一系列軟體的統稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發出來的。從根本上說,STL是一些“容器”的集合,這些“容器”有list,vector,set,map等,STL也是演算法和其他一些元件的集合。這裡的“容器”和演算法的集合指的是世界上很多聰明人很多年的傑作。STL的目的是標準化元件,這樣就不用重新開發,可以使用現成的元件。STL是C++的一部分,因此不用安裝額外的庫檔案。 -----百度百科
簡單的說,STL就是c++對於使用者的一種外掛,其包含有大量的模板類和模板函式,是 C++ 提供的一個基礎模板的集合,用於完成諸如輸入/輸出、數學計算等功能。,使用者可以使用STL來完成一些簡單的操作,如插入,刪除,查詢,排序....利用STL會使你的程式變得"短小精悍",沒有必要再像之前一樣寫很多很多的函式來表示不同的操作.STL,
Part 2 常用的STL
STL下含6個部分(容器(containers)、迭代器(iterators)、空間配置器(allocator)、配接器(adapters)、演算法(algorithms)、仿函式(functors)六個部分)。,13個頭檔案,(algorithm、deque、functional、iterator、vector、list、map、<memory.h>、numeric、queue、set、stack和utility。)這一次我們談一談我認為(不要槓)比較重要的幾個STL函式
第一個 queue
這是線性表中的一種東西--佇列,滿足FIFO,先進先出的資料結構,(單行線)
#include<queue>//打STL必須要加上必要的標頭檔案
queue<int> q;//這樣就定義了一個儲存型別為int的STL佇列.
而<queue>這個標頭檔案下還包含了另一個佇列(priority queue),優先佇列,而這個佇列滿足的要求是FILO(first in,largest out)優先佇列滿足了一種叫大根堆的東西,其最大的排在前面的特性使其充分適用於大根堆(題外話,過載運算子後,可以用優先佇列寫小根堆)奇技淫巧 by 扶蘇
這裡我們主要談一談queue 單調佇列
q.empty();//一個bool函式,若佇列為空則返回1,不為空,返回0;
int x;//按照定義時的來,不一定是int
q.push(x); //把x這個變數加入佇列中.
q.pop();//彈出隊首資料
q.size();//返回的值是佇列中非零資料的個數.
q.front();// 隊首值
q.back();// 隊尾值
queue在運用中大部分的問題都可以運用這些方式解決.
佇列在廣搜與圖論最短路中也有重要應用
第二個 stack 棧
和佇列類似,棧也是一種線性表,也滿足 FILO(是不是有點眼熟,這個是先進後出 first in last out)
#include<stack>
stack <int> s;
棧的常用操作有五個
分別是(top push pop size empty)
s.top();//棧頂
int x;
s.push(x);//入棧
s.pop();//彈出棧頂元素
s.size();//棧中資料個數
s.empty(); //判斷棧是否為空;
第三個 vector
很簡單來說,vector容器就是一個可以任意更改長短的向量,我們可以存下不超過它的長度的資料,當然也可以隨時給他增加長度或者減少長度。
#include<vector>
vector<int> v;
既然是STL模板庫裡的東西,必定有一些配套的函式,
v.size();v.empty();//好像每一個STL容器都支援這個,含義也相同
v.clear();//把整個vector全部清空
v.front() //返回第一個元素
v.back() //返回最後一個元素
vector<int>::iterator it=v.front();//指向第一個元素
//迭代器,相當於STL 容器中的指標;
//加減整數--左移右移
//指標相減--下標差
v.pop_back()//彈出最後的元素;
v.push_back(x)//在隊尾插入一個元素;
第四個 algorithm;
algorithm並不是一個函式,而是包含在這個標頭檔案下的函式.
主要的包括(sort,unique,next_permutation(),reverse,upper_bound()以及lower_bound())
一個一個來:
sort 快速排序
把某一段區間中的數按照從小到大的順序排布(在沒寫另外的函式的條件下)
sort(begin,end(,cmp));//把陣列從begin->end的這一部分按要求排序
unique 去重
把某一段區間中的有序數列做一下去重操作
unique(begin,end)//把begin->end的這一段區間去重
reverse 翻轉
把整個陣列做翻轉操作
reverse(begin,end);//反向儲存
next_permutation 下一個排列
例子 從1--n的n!種全排列
for(int i=1;i<=n;i++) a[i]=i;
do{
for(int i=1;i<n;i++) cout<<a[i]<<" ";
cout<<a[n]<<endl;
}while(next_permutation(a+1,a+n+1));
lower_/upper_bound
lower_ 在有序的序列中,返回第一個大於等於x的元素的位置的迭代器;
upper_ 在有序的序列中,返回第一個大於x的元素位置的迭代器
upper_bound(begin,end,x);
lower_bound(begin,end,x);//便於二分查詢
最後的一個 pair
pair是將2個數據組合成一組資料,當需要這樣的需求時就可以使用pair,如stl中的map就是將key和value放在一起來儲存。另一個應用是,當一個函式需要返回2個數據的時候,可以選擇pair。 pair的實現是一個結構體,主要的兩個成員變數是first second 因為是使用struct不是class,所以可以直接使用pair的成員變數,換句話說,其實pair可以單純的理解為二元組
pair<string, string> anon; // 建立一個空物件anon,兩個元素型別都是string
pair<string, int> word_count; // 建立一個空物件 word_count, 兩個元素型別分別是string和int型別
pair<string, vector<int> > line; // 建立一個空物件line,兩個元素型別分別是string和vector型別
隊成員初始化
pair<string, string> author("James","Joy"); // 建立一個author物件,兩個元素型別分別為string型別,並預設初始值為James和Joy。
pair<string, int> name_age("Tom", 18);
pair<string, int> name_age2(name_age); // 拷貝構造初始化
對於兩個元素的訪問
pair<int ,double> p1;
p1.first = 1;
p1.second = 2.5;
cout<<p1.first<<' '<<p1.second<<endl;
//輸出結果:1 2.5
string firstBook;
if(author.first=="James" && author.second=="Joy")
firstBook="Stephen Hero";
練習題
既然講都講了這麼多了,那就拿幾道來看看
sort的練習 //排序的題單(洛谷)
其實STL並沒有太多的專題,大多還是應用於實踐的.
那就說這麼多吧!
看了這麼多,難道不點個贊嗎???