咸陽(yáng)做網(wǎng)站的公司如何創(chuàng)建個(gè)人網(wǎng)頁(yè)
對(duì)STL進(jìn)行總結(jié),STL是standard template library的簡(jiǎn)寫,是C++中的一個(gè)標(biāo)準(zhǔn)模板庫(kù),用于實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)和算法,它是C++程序員經(jīng)常使用的一個(gè)工具箱。STL 的主要目的是提高開發(fā)效率和代碼質(zhì)量,使得程序員可以更加便捷地完成常見的操作。里面包括:算法(algorithm)、容器(container)、仿函數(shù)(functors)、迭代器(iterator)等,這篇文章先說容器
容器
?容器之所以叫容器,可以抽象理解為我們裝東西的容器,比如裝水的盒子,只不過C++里的容器是用于裝數(shù)據(jù),STL這個(gè)庫(kù)里面,它提供了很多種容器類型用于存儲(chǔ)數(shù)據(jù)。主要包括vector(動(dòng)態(tài)數(shù)組)、set(集合)、map(映射)、stack(棧)、queue(隊(duì)列)、priority—queue(優(yōu)先隊(duì)列)、string(字符串)、pair(二元組)?
- vector:可以動(dòng)態(tài)調(diào)整大小的數(shù)組,支持快速的隨機(jī)訪問和迭代器訪問,并且支持在尾部添加或刪除元素。
- set:有序集合,其中每個(gè)元素都是唯一的,支持快速的查找和插入操作。
- unordered_set:無序集合,其中每個(gè)元素都是唯一的,支持快速的查找和插入操作,但元素的順序是未定義的。
- map:有序映射,其中每個(gè)元素都有一個(gè)唯一的鍵值對(duì),支持快速的查找和插入操作。
- unordered_map:無序映射,其中每個(gè)元素都有一個(gè)唯一的鍵值對(duì),支持快速的查找和插入操作,但元素的順序是未定義的。
- deque:雙端隊(duì)列,支持快速的隨機(jī)訪問和迭代器訪問,并且支持在頭部和尾部添加或刪除元素。
- list:雙向鏈表,只支持迭代器訪問,并且支持在任意位置添加或刪除元素。
?vector
?它的和數(shù)組差不多,區(qū)別就是他的長(zhǎng)度是動(dòng)態(tài)可變的,存儲(chǔ)在堆中,一般可以替換普通數(shù)組
#include<vector>? ?
vector<類型> 數(shù)組名(長(zhǎng)度,[初值])? ?//構(gòu)造
vector<int> arr;? ? ? ? ?//構(gòu)造int數(shù)組
vector<int> arr(100);? ? ? ? //構(gòu)造初始長(zhǎng)度100的數(shù)組
vector<int> arr(100,1);? ? ? ? //構(gòu)造初始長(zhǎng)度100的數(shù)組,初值為1
vector<vector<int>? mat(100,vector<int>());? ? ? ? //構(gòu)造初始100行,不指定列數(shù)的二維數(shù)組
vector<vector<int>>??mat(100,vector<int>(666,-1));? ? ? ? //構(gòu)造初始100行,初始列600的二維數(shù)組,初始值-1
vector<vector<vetcor<int>>>? mat1(100, vector<vector<int>>(6,vector<int>(4)));? ? ? ? //構(gòu)造初始100行,初始列6的三維維數(shù)組,
?尾接&尾刪
- push_back(元素):在vector尾接一個(gè)元素,數(shù)組長(zhǎng)+1
- pop_back():刪除vector尾部的一個(gè)元素,數(shù)組長(zhǎng)度-1
?改變長(zhǎng)度
?數(shù)組名.resize()
?arr.resize(100);? ? ? ? //將vector的長(zhǎng)度改為100
set?
set 里的元素只出現(xiàn)一次,且元素沒有順序 ,因此適用于對(duì)元素去重,維護(hù)順序等
#include<set>
set<類型,比較器> 集合名? ? ? ? //構(gòu)造
set<int> st;? ? ? ? //存儲(chǔ)int集合(從小到大)
set <int,greater<int>> st1;? ? ? ? //存儲(chǔ)int集合(從大到小)?
?遍歷
使用迭代器進(jìn)行遍歷
#include<bits/stdc++.h>
using namespace std;int main()
{set<int> st; //構(gòu)造一個(gè)集合st.insert(1); //插入1st.insert(2); //插入2st.erase(1); //刪除1st.find(2); //找到1就返回1//遍歷for (set<int>::iterator it = st.begin(); it !=st.end(); ++it){cout << *it <<endl;}return 0;
}
map?
?有序鍵值對(duì)結(jié)構(gòu),底層原理是黑紅樹。一個(gè)鍵只可以在映射中出現(xiàn)一次,且沒有順序
健類型:要存儲(chǔ)健的數(shù)據(jù)類型
值類型:要存儲(chǔ)的數(shù)據(jù)類型
比較器:鍵要比較大小使用的比較器,默認(rèn)為less<數(shù)據(jù)類型>,可自定
#include<map>
map<健類型,值類型,比較器> 名字? ? ? ? //構(gòu)造map
map<int,int> mp;? ? ? ? //?int—>int的映射(從小到大)
map<int,int,greater<int>> mp1;? ? ? ? //?int—>int的映射(從大到小)
mp[1] =? 2;? ? ? ? //增加
mp.erase(1);? ? ? ? //? 刪除1這個(gè)鍵
mp[1] = 3;? ? ? ? // 改
cout << mp[1] << endl;? ? ? ? //查
mp.count(元素);? ? ? ? //檢查元素是否存在
for(map<int,int>::iterator it =mp.begin(); it != mp.end(); ++it)
{ cout << it -> first << ' ' << i-> second << endl;
}//上述用迭代器的方法太長(zhǎng) 不好讀 一般使用下面基于范圍循環(huán)的方法for(auto &m:mp) //&是引用 m 是自定義的 mp是要便利的map的名字
{cout<<m.first << '' << m.second << endl;
}
stack
通過二次封裝雙端隊(duì)列(queue),實(shí)現(xiàn)先進(jìn)后出的棧數(shù)據(jù)結(jié)構(gòu)?
?#include<stack>
stack<數(shù)據(jù)類型>? 名字
?
stack<int> stk;? ? ? ? //構(gòu)造一個(gè)棧
stk.push(1);? ? ? ? //進(jìn)棧
stk.pop();? ? ? ? //出棧
stk.top();? ? ? ? //取頂棧
queue?
?先進(jìn)先出
#include<queue>
queue<數(shù)據(jù)類型> 隊(duì)名? ? ? ? ?//構(gòu)造隊(duì)列
queue<int> que;? ? ? ? //構(gòu)造一個(gè)叫que的隊(duì)列
que.push(元素);? ? ? ? //進(jìn)隊(duì)
que.pop();? ? ? ? //出隊(duì)
que.front() ;? ? ? ? //取隊(duì)首
que.back();? ? ? ? //取隊(duì)尾
deque??
首尾都可插入和刪除的隊(duì)列為雙端隊(duì)列
雙端隊(duì)列排序一般不用?
priority_queue?
優(yōu)先隊(duì)列是在正常隊(duì)列的基礎(chǔ)上加了優(yōu)先級(jí),保證每次的隊(duì)首元素都是優(yōu)先級(jí)最大的。
可以實(shí)現(xiàn)每次從優(yōu)先隊(duì)列中取出的元素都是隊(duì)列中優(yōu)先級(jí)最大的一個(gè)
#include<queue>
priority_queue<數(shù)據(jù)類型> 名字? ? ? ? ?//構(gòu)造一個(gè)優(yōu)先隊(duì)列
priority_queue<int> q1; // 默認(rèn)大根堆, 即每次取出的元素是隊(duì)列中的最大值
priority_queue<int, vector<int>, less<int> > q2; // 大根堆, 每次取出的元素是隊(duì)列中的最大值,同第一行priority_queue<int, vector<int>, greater<int> > q3; // 小根堆, 每次取出的元素是隊(duì)列中的最小值
?
string
存儲(chǔ)字符串
string (長(zhǎng)度,初值)? ? ? ? //構(gòu)造函數(shù)
string s1;? ? ? ? //構(gòu)造字符串,為空
string s2 ="abcde";? ? ? ? //構(gòu)造字符串 并賦值abcd
string s3(10,'6');? ? ? ? //通過構(gòu)造函數(shù)構(gòu)造為66666666666
cin >>?s1;? ? ? ? ?//輸入字符串
cout << s1;? ? ? ? //輸出字符串
?s1+="fgj";? ? ? ? //尾接字符串
pair
存儲(chǔ)二元組,兩個(gè)元素的一個(gè)組合
#include<utiity>
pair<類型,類型> pr? ? ? ? //構(gòu)造一個(gè)二元組
pari<int, int> p1;? ? ? ? ?//存儲(chǔ)int型的元組
pair<int, long long> p2;? ? ? ? ?
pair<int, char> pr3={1,'a'};? ? ? ? //賦值 第一個(gè)元素是1,第2個(gè)元素是a
int? a = pr.first;? ? ? ? //取第一個(gè)值
int b = pr.second;? ? ? ? //取第二個(gè)值
?