c++标准模板库STL【快速查找】【最全】【常用】【语法】
c++標(biāo)準(zhǔn)模板庫(kù)STL【快速查找】【最全】【常用】【語(yǔ)法】
??? c標(biāo)準(zhǔn)模板庫(kù)STL快速查找最全常用語(yǔ)法
??????? vector- 變長(zhǎng)數(shù)組
??????? set-內(nèi)部自動(dòng)有序且不含重復(fù)元素
??????? string-字符串處理
??????? map-鍵值對(duì)
??????? queue-隊(duì)列
??????? priority_queue-優(yōu)先隊(duì)列
??????? stack-棧
??????? pair
vector- 變長(zhǎng)數(shù)組
添加頭文件:
#include <vector>
定義vector:
vector<typename> name; //typename可以是任何基本類型,也可以是STL容器
vector<vector<typename> > name; //c++11之前會(huì)將>>視為移位操作,所以要加空格> >
定義vector數(shù)組:
vector<typename> Arrayname[arraySize]; //與vector<vector<typename> >不同的是一維已經(jīng)固定長(zhǎng)度為arraySize
訪問(wèn):
??? 通過(guò)下標(biāo)訪問(wèn)name[index]
??? 通過(guò)迭代器訪問(wèn)
??? 迭代器類似指針,定義為vector<typename>::iterator it = name.begin()
??? 得到 it 后通過(guò) *it 來(lái)訪問(wèn)vector里的元素, *(it + i) 來(lái)訪問(wèn)第i個(gè)元素
??? 循環(huán)可以這樣寫(xiě):
for(vector<typename>::iterator it = name.begin(); it != name.end(); it++){}
常用函數(shù):
??? push_back() 尾插,時(shí)間復(fù)雜度為O(1)
pop_back() 尾刪,時(shí)間復(fù)雜度為O(1)
size() 長(zhǎng)度,返回unsigned類型,時(shí)間復(fù)雜度為O(1)
clear() 清空,時(shí)間復(fù)雜度為O(n)
insert(it, x) 向迭代器it處插入元素x,時(shí)間復(fù)雜度為O(n)
erase()
??? 刪除單個(gè)元素 erase(it)
??? 刪除一個(gè)區(qū)間[first, last)的元素erase(first, last) //first與last都是迭代器
??? 時(shí)間復(fù)雜度均為O(n)
set-內(nèi)部自動(dòng)有序且不含重復(fù)元素
添加頭文件:
#include <set>
定義set
set<typename> name;
??? 1
訪問(wèn)
只能通過(guò)迭代器訪問(wèn):
set<typename>::iterator it;
??? 1
得到it之后按*it來(lái)訪問(wèn)set里的元素
由于除開(kāi)vector和string之外的STL容器都不支持*(it + i)的訪問(wèn)方式,因此只能采用下列方式枚舉:
for(set<typename>::iterator it = name.begin(); it != name.end(); it++){}
??? 1
常用函數(shù)
??? insert() 時(shí)間復(fù)雜度O(logN)
,因?yàn)榈讓邮褂眉t黑樹(shù)來(lái)實(shí)現(xiàn)
find(value) 返回對(duì)應(yīng)值為value的迭代器,時(shí)間復(fù)雜度為O(logN)
erase()
??? 刪除單個(gè)元素
??????? name.erase(it) 時(shí)間復(fù)雜度為O(1)
name.erase(value) 時(shí)間復(fù)雜度為O(logN)
刪除一個(gè)區(qū)間[first, last)內(nèi)的元素 name.erase(first, last), 時(shí)間復(fù)雜度為O(last?first)
size() 時(shí)間復(fù)雜度為O(1)
clear() 清空 O(N)
string-字符串處理
添加頭文件
#include <string>
??? 1
定義
string str;
string str = "abcd"; //定義的同時(shí)初始化
??? 1
??? 2
訪問(wèn)
讀入輸出只能用cin和cout
或者用c_str()將string類型轉(zhuǎn)成字符數(shù)組,再用printf()輸出
string str = "abcd";
printf("\n", str.c_str());
??? 1
??? 2
??? 通過(guò)下標(biāo)訪問(wèn)
??? 通過(guò)迭代器訪問(wèn)
??? 與vector一樣可以通過(guò)*(it + i)的方式訪問(wèn)
常用函數(shù)
??? += 拼接賦值
??? ==、!=、<、<=、>、>=比較大小,字典序
??? length()/size() 返回string長(zhǎng)度,O(1)
insert() O(N)
??? insert(pos, string) 在pos位置插入string
??? insert(it, it2, it3) it為原字符串的欲插入位置,it2和it3為待插入字符串的首尾迭代器,[it2, it3)
erase()
??? erase(it) 刪除單個(gè)元素
??? erase(first, last) 刪除區(qū)間[first, last)的所有元素
??? erase(pos, length), 刪除pos處開(kāi)始的length長(zhǎng)度的字符個(gè)數(shù)
clear() O(1)
substr(pos, len) 返回從pos號(hào)位開(kāi)始,長(zhǎng)度為len的子串,時(shí)間復(fù)雜度為O(len)
string::npos 是一個(gè)常數(shù),用以find函數(shù)失配時(shí)的返回值,即等于-1也等于4294967295(unsigned_int類型最大值)
find()
??? find(str2) 找子串第一次出現(xiàn)的位置,若不是,返回string::npos
??? find(str2, pos), 從str的pos號(hào)位開(kāi)始匹配str2
??? 時(shí)間復(fù)雜度為O(mn)
??? ,其中n和m分別是str和str2的長(zhǎng)度
replace() O(str.length())
??????? replace(pos, len, str2) 把str從pos號(hào)位開(kāi)始,長(zhǎng)度為len的子串替換為str2
??????? replace(it1, it2, str2) 把str的迭代器[it1, it2)范圍的子串替換為str2
map-鍵值對(duì)
添加頭文件
#include <map>
??? 1
定義
map<typename1, typename2> mp;
??? 1
訪問(wèn)
??? 通過(guò)下標(biāo)訪問(wèn),例如mp[‘a(chǎn)’]
??? 通過(guò)迭代器訪問(wèn)
?- map<typename1, typename2>::iterator it;
?- for(map<typename1, typename2>::iterator it = mp.begin(); it != mp.end(); it++){
??? //it->first; 訪問(wèn)鍵
??? //it->second; 訪問(wèn)值
}
??? 1
??? 2
??? 3
??? 4
??? 5
常用函數(shù)
??? find(key) 返回key的映射的迭代器, 時(shí)間復(fù)雜度為O(logN)
, 底層紅黑樹(shù)實(shí)現(xiàn)
erase()
??? erase(it) O(1)
erase(key) O(logN)
erase(first, last) 刪除[first, last)區(qū)間元素,O(last?first)
size() O(1)
clear() O(N)
queue-隊(duì)列
添加頭文件
#include <queue>
??? 1
定義
queue<typename> name;
??? 1
訪問(wèn)
??? front() 訪問(wèn)隊(duì)首
??? back() 訪問(wèn)隊(duì)尾
常用函數(shù)
??? push() O(1)
front(),back() O(1)
pop() O(1)
隊(duì)首出隊(duì)
empty() 檢測(cè)queue是否為空,返回true為空,O(1)
size() O(1)
priority_queue-優(yōu)先隊(duì)列
用堆來(lái)實(shí)現(xiàn),每次插入元素根據(jù)元素的優(yōu)先級(jí)向上調(diào)整到堆頂
添加頭文件
#include <queue>
??? 1
定義
priority_queue< typename > name;
??? 1
訪問(wèn)
只能通過(guò)top()函數(shù)來(lái)訪問(wèn)隊(duì)首元素(堆頂元素),也就是優(yōu)先級(jí)最高的元素
常用函數(shù)
??? push() 往堆底插入元素,向上調(diào)整,所以時(shí)間復(fù)雜度為O(logN)
top() O(1)
pop() 令隊(duì)首元素出隊(duì),將隊(duì)尾元素復(fù)制到隊(duì)首,并向下調(diào)整,刪除隊(duì)尾,所以時(shí)間復(fù)雜度為O(logN)
empty() 檢測(cè)是否為空,O(1)
size() O(1)
優(yōu)先級(jí)設(shè)置
??? 基本數(shù)據(jù)類型
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;//vector<int>填寫(xiě)的是來(lái)承載底層heap的容器,less<int>是對(duì)第一個(gè)參數(shù)的比較類,less<int>表示數(shù)字大的優(yōu)先級(jí)越大
priority_queue<int, vector<int>, greater<int> > q;//數(shù)字小的優(yōu)先級(jí)大
??? 1
??? 2
??? 3
??? 結(jié)構(gòu)體
struct student{
??? //學(xué)生成績(jī)
??? string s_id;
??? int s_grade;
??? friend bool operator < (student s1, student s2){
??????? //重載< 重載>號(hào)會(huì)編譯錯(cuò)誤
??????? return s1.s_grade < s2.s_grade;//s_grade大的優(yōu)先級(jí)高
??????? //若s_grade小的優(yōu)先級(jí)高,則改為return s1.s_grade > s2.s_grade;
??? }
}
priority_queue<student> q;
??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11
將重載<放到student結(jié)構(gòu)體外
struct cmp{
??? bool operator (const student &s1, const student &s2){
??????? //使用引用避免復(fù)制,提高效率
??????? return s1.s_grade > s2.s_grade;
??? }
}
priority_queue<student, vector<student>, cmp> q;
??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
stack-棧
添加頭文件
#include <stack>
??? 1
定義
stack<typename > name;
??? 1
訪問(wèn)
使用top()來(lái)訪問(wèn)棧頂元素
常用函數(shù)
??? push() O(1)
top() O(1)
pop() O(1)
empty() O(1)
size() O(1)
pair
添加頭文件
#include <utility>
??? 1
定義
pair<typename1, typename2> p;
pair<string, int> p("jetlee", 18); //定義的同時(shí)初始化
//定義臨時(shí)pair的兩種方式
p = pair<string, int>("jetlee", 18);
p = make_pair("jetlee", 18);
? ?
訪問(wèn)
pair中只有兩個(gè)元素,分別用first和second來(lái)訪問(wèn)
常用函數(shù)
??? 比較操作數(shù):==、!=、<、<=、>、>=;比較規(guī)則是先比較first,first相同時(shí)再比較second
--------------------- ?
作者:階藝勿聽(tīng) ?
來(lái)源:CSDN ?
原文:https://blog.csdn.net/sinat_25721683/article/details/79073336 ?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的c++标准模板库STL【快速查找】【最全】【常用】【语法】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C中浮点数转字符串
- 下一篇: C++11中range-based fo