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