stl提供了一些模板類,實現了《資料結構》中的一些資料結構型別
在寫**時用到棧,佇列等資料結構時可以充分利用stl模板類,會發現特別好用。
想起c語言中用陣列實現棧和佇列,簡直就是噩夢。
c++是世界上最好的語言。。。(just kidding !!!)
順序容器:動態陣列
vector;deque
鍊錶list;
關聯容器:set/multiset
有序值;
map/multimap
有序鍵值對
一.
動態陣列
vector
類
1.定義:#includestd::vectorv;
2.初始化:v(10); //預設初始大小為10
v(10,90);//設10個90
v(v1); //用另乙個vector類初始化它,複製
v(v1.begin(),v1.begin()+5);把v1的前5個元素複製給它
3.迭代器定義:std::vector::iterator p = v.begin;//定義迭代器p;並初始化指向v開頭
4.成員函式
(1)插入元素到陣列末尾: v.push_back(50);//把50插到末尾
插入元素到任意位置 : v(4);v[0]=30;v[1]=29;v[2]=67;v[3]=19;
插入元素insert
函式: v.insert(v.begin(),25);//在v的最前面插入25
v.insert(v.end(),2,25);//在v的最後面插入2個25
v.insert(v.begin+1,v1.begin(),v1.end())//在v位置1插入v1的元素
(2)容量和大小:v.size();//返回當前元素個數
v.capacity();//返回容量,即最多能存多少個元素
(3)訪問元素:1. v[3];//使用陣列下標,有越界風險
2. v.at(3);//使用at函式,自動檢查容器大小,無越界風險
3. vector::iteratorp=v.begin(); p++; cout<<*p;//迭代器訪問
(4)求兩個位置的距離 int i = distance(v.begin(),p)//p是迭代器
(5)刪除末尾元素:v.pop_back();
(6)判斷空不空:v.empty();陣列空則返回1
二.
動態陣列
deque
類:
與vector類似,只是也支援在開頭插入元素
定義:#includestd::dequed;
在開頭插入元素:v.push_front(5);
在開頭刪除元素:v.pop_back();
三.
雙向鍊錶
list
1.
定義:#includelistl;
2.插入元素:l.push_front(5);//在l的開頭插入5
l.push_back(5);// 在l的末尾插入5
l. insert(p,5);//在迭代器p處插入5;函式返回迭代器,指向剛插入的元素
l. insert(p,2,5);//在位置p插入2個5
l.insert(p,l2.begin(),l2.end());//在位置6插入l2的一段
3.
刪除元素:l.erase(p);//刪除迭代器p指向的元素
l.erase(p1,p2)//刪除迭代器p1,p2之間的元素
l.clear();//清空整個鍊錶
4.翻轉list元素的順序:l.reverse();
5排序:l.sort();//公升序排列
l.sort(cmp);//按二元謂詞cmp排列
6 list是鍊錶結構,不能用list.begin()+3來訪問元素,可以用list.begin++來訪問
四.自動排序型別:
set和
multiset
1. 定義:#includesets1;multisets2;// 預設公升序排列
sets;//使用cmp排序
2. 查詢 s.find(5);//返回指向5的迭代器
3. 刪除:s.erase(5);//刪除值為5的元素
s.erase(p);//刪除迭代器p指向的元素
s.erase(p1,p2);//刪除p1,p2之間的元素
五.自動排序型別:
map和
multimap:
儲存一對值
1.
定義:#includemapm1;multimapm2//預設鍵公升序排列
mapm;// 使用cmp排序
2.
插入元素:m.insert(make_pair(5,a));//插入鍵值對(5,a)
3.
查詢元素
; m.find(5);//返回指向5的迭代器
4. 訪問:cout5.
刪除:m.erase(5);//刪除值為5的元素
m.erase(p);//刪除迭代器p指向的元素
m.erase(p1,p2);//刪除p1,p2之間的元素
六.自適應容器
佇列queue
優先順序佇列
priority_queue
棧
stack
1.定義:#includestacks;//預設在內部使用deque
來儲存資料
stack> s;//內部用vector來儲存資料
2.成員函式: s.push(5);//棧頂插入5
s.pop();//刪除棧頂元素
s.empty();//空棧就返回1
s.top();//獲得指向棧頂元素的引用 cout佇列
queue
1.定義:#includequeueq;// 預設在內部使用deque來儲存資料
queue>q;// 內部用list來儲存資料
2.成員函式: q.push(5);//在隊尾(即最後乙個位置)插入5
q.pop();//刪除隊首元素
q.front();//返回指向隊首元素的引用coutq.size();//返回佇列的元素數
七.
stl通用演算法
#include
1.
查詢findfind(v.begin(),v.end(),5); //在迭代器區間查詢5,返回迭代器;找不到就返回v.end()
find_if(v.begin(),v.end(),cmp); //在迭代器區間檢查每個元素,如果迭代器i
滿足cmp(*i)=true,則返回迭代器i若找不到,則返回v.end();
boolcmp(int x)
2.
統計個數count(v.begin(),v.end(),5); //返回迭代器區間5的個數
count_if(v.begin(),v.end(),cmp);//返回使cmp函式為ture的元素的個數
3.v.begin();//返回第乙個元素的迭代器 v.end();//返回最後乙個元素下乙個位置的迭代器
v.front();//返回第乙個元素的引用 v.back();//返回最後乙個元素的引用
4.子串行搜尋search(v1.begin(),v1.end(),v2.begin(),v2.end());//在v1中找子串行v2,返回指向子串行v2第一次出現的位置的迭代器
5.元素複製
copy(v.begin(),v.end(),l.begin());//把v複製到l的開頭
6.對每個元素執行操作transform(v.begin(),v.end(),v.begin(),function)//第乙個和第二個參
數指出要操作的區間,第三個引數指出結果存放的起始位置,第四個引數是函式名
transform(v1.begin(),v1.end(),v2.begin(),v1.begin(),function);//第乙個第二個
指出要操作的引數1區間, 第三個是引數2起始,第三個是結果存放的起始位置
7
遍歷,對某區間每個元素執行操作:
for_each(v.begin(),v.end(),function)
資料結構與演算法 KMP演算法模板
kmp演算法指的是字串模式匹配演算法,問題是 在主串t中找到第一次出現完整子串p時的起始位置。該演算法是三位大牛 d.e.knuth j.h.morris和v.r.pratt同時發現的,以其名字首字母命名。下面是kmp演算法的c 版本 include include include using na...
資料結構 演算法模板
public double quickmul double x,long n return res const int max n 1e5 5 int par max n 2 int rank max n 2 void init int n int find int x else void unit...
資料結構 STL
棧 先入後出 filo 的一種資料結構。常見操作 模擬火車調頭,進製轉換,表示式求值,單調棧 陣列形式 理解 const int num 1e6 10 定義棧的大小,可自由改變 int stac num 乙個整型棧 int top 棧頂指標 int main top 1 設定棧頂指標為 1 stac...