凡科做網(wǎng)站html網(wǎng)站模板免費(fèi)
前言
寫(xiě)這篇博客目的是為了記錄在刷算法題中使用過(guò)的STL,因?yàn)橛行┎惶S玫臅?huì)遺忘。這篇博客只是作為筆記,不是詳細(xì)的STL,因此只會(huì)對(duì)常用方法說(shuō)明,不會(huì)詳細(xì)介紹。此外在后面用到新的STL內(nèi)容時(shí)會(huì)再補(bǔ)充。
列隊(duì)
基礎(chǔ)列隊(duì)
基本列隊(duì)是queue,其中主要有入隊(duì)、出隊(duì)、讀取隊(duì)尾或則隊(duì)首元素、獲取隊(duì)列長(zhǎng)度這幾個(gè)方法。
方法 | 說(shuō)明 |
---|---|
pop() | 刪除首元素 |
push() | 添加一個(gè)元素 |
front() | 獲取隊(duì)首元素 |
back() | 獲取隊(duì)尾元素 |
size() | 隊(duì)列長(zhǎng)度 |
empty() | 判斷是否為空 |
這里是基礎(chǔ)列隊(duì)queue,有的時(shí)候在寫(xiě)算法時(shí)為了滿足某些需要。需要隊(duì)列可以彈出隊(duì)尾元素。這里queue并沒(méi)有提供相應(yīng)的方法,當(dāng)然如果需要可以使用迭代器的 erase() 方法,該方法目的是刪除某個(gè)元素,并將后面元素前移。
雙端操作列隊(duì)
這里可以使用修改版的列隊(duì)deque,該列隊(duì)提供了更加多樣的操作,使得列隊(duì)可以在任何端進(jìn)行插入和刪除操作。這里deque相比于vector優(yōu)勢(shì)是速度快一點(diǎn)。
方法 | 說(shuō)明 |
---|---|
pop_front() | 刪除隊(duì)首元素 |
pop_back() | 刪除隊(duì)尾元素 |
push_front() | 隊(duì)首添加一個(gè)元素 |
push_back() | 隊(duì)尾添加一個(gè)元素 |
front() | 獲取隊(duì)首元素 |
back() | 獲取隊(duì)尾元素 |
size() | 隊(duì)列長(zhǎng)度 |
empty() | 判斷是否為空 |
向量數(shù)組
向量數(shù)組vector,向量數(shù)組相比于傳統(tǒng)的數(shù)組,優(yōu)勢(shì)在于其長(zhǎng)度可以動(dòng)態(tài)擴(kuò)展,而不必一開(kāi)始就規(guī)定數(shù)組大小。并直接提供了隊(duì)尾添加刪除操作。
方法 | 說(shuō)明 |
---|---|
pop_back() | 刪除尾元素 |
push_back() | 向尾部添加一個(gè)元素 |
front() | 獲取首元素 |
back() | 獲取尾元素 |
size() | 隊(duì)列長(zhǎng)度 |
empty() | 獲取數(shù)組長(zhǎng)度 |
例如代碼:
#include<bits/stdc++.h>
using namespace std;
int main(){vector<int> a;for(int i=0;i<10;i++)a.push_back(i);a.pop_back();for(int i=0;i<a.size();i++){cout<<a[i]<<' ';}cout<<endl<<a.size();
}
結(jié)果是:
這里經(jīng)常配合使用的方法是**unique(a,b)**該方法是將重復(fù)元素移動(dòng)到數(shù)組尾部,參數(shù)分別是開(kāi)始和結(jié)束部分迭代器。返回不重復(fù)部分最后一個(gè)元素的迭代器。
集合
集合特點(diǎn)是自動(dòng)排序,并且集合沒(méi)有重復(fù)元素。集合沒(méi)有提供按元素查找方式,可以通過(guò)迭代器實(shí)現(xiàn),具體實(shí)現(xiàn)看這篇博客。
基礎(chǔ)集合
基礎(chǔ)集合是set 該集合不允許出現(xiàn)重復(fù)元素(出現(xiàn)相同元素會(huì)被覆蓋)。默認(rèn)按照升序排序。也可以指定排序方式。
方法 | 說(shuō)明 |
---|---|
size() | 集合元素個(gè)數(shù) |
insert() | 插入元素 |
empty() | 集合是否為空 |
find() | 查找元素,返回迭代器 |
#include<bits/stdc++.h>
using namespace std;
struct cmp{bool operator()(const int&a,const int&b){if(a<b)return false;return true;}
};//定義的排序方法
int main(){set<int,cmp> m; //按照定義進(jìn)行排序set<int>::iterator iters;m.insert(1);m.insert(9);iters=m.begin();cout<<*iters<<' ';cout<<m.size();
}
結(jié)果是
9 2
可重復(fù)集合
可重復(fù)集合是multiset,該集合區(qū)別是可以重復(fù)存儲(chǔ)相同元素。不會(huì)覆蓋,除此之外方法等和set基本沒(méi)什么區(qū)別。
映射
映射是map,映射通過(guò)鍵值對(duì)一一映射,從而可以快速查詢數(shù)據(jù)。一般來(lái)說(shuō)使用時(shí)和數(shù)組差不多。沒(méi)什么很多方法,如果一個(gè)鍵值對(duì)不存在,并查詢一個(gè)不存在的鍵時(shí),如果值類(lèi)型是整形,則其值等于0
#include<bits/stdc++.h>
using namespace std;
int main(){map<int,int> m;m[1]=100;m[2]++;cout<<m[1]<<' '<<m[2]<<' '<<m[3]<<endl;
}
結(jié)果為:
pair
pair是將兩個(gè)數(shù)據(jù)組成一個(gè)元素,其中這兩個(gè)數(shù)據(jù)類(lèi)型可以是不同類(lèi)型。主要通過(guò)first訪問(wèn)第一個(gè)數(shù)據(jù)元素,通過(guò)second訪問(wèn)第二個(gè)數(shù)據(jù)元素。
#include<bits/stdc++.h>
using namespace std;
int main(){pair<int,char> a;a.first=4;a.second='a';cout<<a.first<<' '<<a.second;
}
結(jié)果為
迭代器
迭代器類(lèi)似于指針,對(duì)于上述數(shù)據(jù)類(lèi)型。都可以獲取其相應(yīng)的迭代器。如果c++版本夠高可以直接使用auto接收返回的迭代器。不過(guò)我的c++版本太低只能自己定義。其定義方式是數(shù)據(jù)類(lèi)型::iterator 迭代器名
.具體如下如下:
定義一個(gè)map<int,int>名為iters的迭代器:
map<int,int>::iterator iters
在上述類(lèi)型中一般使用如下獲取相應(yīng)迭代器
方法 | 說(shuō)明 |
---|---|
begin() | 指向第一個(gè)元素迭代器 |
end() | 最后的迭代器 |
這兩個(gè)方法是通用的,有些數(shù)據(jù)類(lèi)型也提供其他放回迭代器的方法,例如set的find()方法,返回一個(gè)指向目標(biāo)元素的迭代器。迭代器訪問(wèn)是通過(guò)*迭代器變量名
。
迭代器向前移動(dòng)可以通過(guò)方法advance(iters,steps)
參數(shù)分別是迭代器名和向前移動(dòng)步數(shù)。
#include<bits/stdc++.h>
using namespace std;
int main(){deque<int> a;deque<int>::iterator iters; //deque<int>類(lèi)型迭代器for(int i=0;i<10;i++){a.push_back(i);}iters=a.begin(); //獲取指向第一個(gè)元素的迭代器for(int i=0;i<a.size();i++){cout<<*iters<<' ';advance(iters,1); //迭代器向前移動(dòng)一個(gè)元素}
}
結(jié)果為
刪除方法是erase()
該方法將迭代器指向元素刪除,并將后面元素向前移動(dòng)。
例如代碼
#include<bits/stdc++.h>
using namespace std;
int main(){deque<int> a;deque<int>::iterator iters; for(int i=0;i<10;i++){a.push_back(i);}iters=a.begin();a.erase(iters);iters=a.begin();cout<<*iters<<endl;
結(jié)果為;