STL模板類 資料結構與演算法

2021-07-03 16:21:14 字數 4583 閱讀 7448

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...