寫在前面
創(chuàng)新互聯是專業(yè)的通化網站建設公司,通化接單;提供成都網站建設、網站設計,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行通化網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!【算法設計與分析】這一系列是作者在本學期學習算法的時候做的筆記,由于本人水平有限,對很多概念的理解比較淺顯😭,歡迎各位大佬多多評價,多多批評指正,希望與大家互相交流學習👻。
參考資料
[1] Mark Allen Weiss 《數據結構與算法分析C語言描述》
[2] Stephen Prata《C Primer Plus》
[3] 余文溪 黃襄念《C++ STL——數據結構與算法實現》
[4] HUST算法設計與分析組 PPT
[5]高暢 《LeetCode 101:和你一起輕松刷題》
最后更新時間
2022-11-25 22:40
定義
#includevectorname;
??上面這個定義其實就是相當于定義了一個一維數組name[SIZE]
,只不過其長度可以根據需要進行變化。
??如果typename也是一個STL容器,定義的時候需要在>>符號之間加上一個空格,防止編譯器誤以為是移位符。
vector>name;
??定義二維數組有以下兩種方式:
vectorname[SIZE];
vector>name;
??動態(tài)開辟二維vector:
int m = 3;//行數
int n = 4;//列數
vector>Name(m, vector(n));//默認初始化為0
for (int i = 0; i< m; i++)
{for (int j = 0; j< n; j++)
{cout<< Name[i][j];
}
cout<< endl;
}
內部元素的訪問
name[index]
即可。vector::iterator it;
??然后就可以用這個迭代器來訪問容器內的元素:
#include#includeusing namespace std;
int main()
{vectorvi;
for (int i = 1; i<= 5; i++)
{vi.push_back(i);
}
vector::iterator it = vi.begin();
for (int i = 0; i< 5; i++)
{cout<< *(it + i);
}
return 0;
}
??其中,vi.begin()
為取vi的首元素地址,it指向這個地址。再引入vi.end()
,它是去取尾元素地址的下一個地址,不是尾元素地址。
??還有另一種使用迭代器遍歷的方法:
#include#includeusing namespace std;
int main()
{vectorvi;
for (int i = 1; i<= 5; i++)
{vi.push_back(i);
}
for (vector::iterator it = vi.begin(); it != vi.end(); it++)
{cout<< *it;
}
return 0;
}
??注意vector迭代器并不支持it
it!=vi.end()
。
push_back()
??push_back(x)
就是在vector最后添加一個元素x,時間復雜度為
O
(
1
)
O(1)
O(1)。
#include#includeusing namespace std;
int main()
{vectorvi;
for (int i = 1; i<= 3; i++)//將1、2、3依次插入vi末尾
{vi.push_back(i);
}
for (int i = 0; i< vi.size(); i++)
{cout<< vi[i];
}
return 0;
}
pop_back()
??pop_back
用以刪除vector的尾元素,時間復雜度
O
(
1
)
O(1)
O(1)。
#include#includeusing namespace std;
int main()
{vectorvi;
for (int i = 1; i<= 3; i++)//將1、2、3依次插入vi末尾
{vi.push_back(i);
}
vi.pop_back();
for (int i = 0; i< vi.size(); i++)
{cout<< vi[i];//輸出1 2
}
return 0;
}
size()
??size()
用來獲得vector中元素的個數,返回unsigned類型,時間復雜度為
O
(
1
)
O(1)
O(1)。
clear()
??clear()
直接清空vector中所有的元素,時間復雜度為
O
(
N
)
O(N)
O(N),N為元素的個數。
insert()
??insert(it,x)
用來向vector的迭代器it處插入一個元素x,時間復雜度為
O
(
N
)
O(N)
O(N)。
#include#includeusing namespace std;
int main()
{vectorvi;
for (int i = 1; i<= 5; i++)
{vi.push_back(i);//1 2 3 4 5
}
vi.insert(vi.begin() + 2, -1);
for (int i = 0; i< vi.size(); i++)
{cout<< vi[i];//1 2 -1 3 4 5
}
return 0;
}
erase()
??1. 刪除單個元素erase(it)
。
#include#includeusing namespace std;
int main()
{vectorvi;
for (int i = 1; i<= 5; i++)
{vi.push_back(i);//1 2 3 4 5
}
vi.erase(vi.begin() + 3);
for (int i = 0; i< vi.size(); i++)
{cout<< vi[i];//1 2 3 5
}
return 0;
}
??2.刪除一個區(qū)間內的所有元素earse(first,last)
,區(qū)間左閉右開。
#include#includeusing namespace std;
int main()
{vectorvi;
for (int i = 1; i<= 5; i++)
{vi.push_back(i);//1 2 3 4 5
}
vi.erase(vi.begin() + 1, vi.begin() + 3);
for (int i = 0; i< vi.size(); i++)
{cout<< vi[i];//1 4 5
}
return 0;
}
主要用途
定義
setname;
??set翻譯為集合,是一個內部自動有序且不含重復元素的容器。
元素訪問
??注意,由于除了vector和string之外的STL容器都不支持*(it+i)
的訪問方式,所以只能按以下方式枚舉:
#include#includeusing namespace std;
int main()
{setst;
st.insert(3);
st.insert(5);
st.insert(2);
st.insert(3);
for (set::iterator it = st.begin(); it != st.end(); it++)
{cout<< *it<< endl; //2 3 5
}
return 0;
}
??可以發(fā)現,set內的元素自動遞增排序,且自動去除了重復的元素。
insert()
??insert(x)
可以將x插入到set容器中,并且自動排序和去重,時間復雜度為
O
(
log
?
N
)
O(\log N)
O(logN),N為元素個數。
find()
??find(value)
返回set中對應值為value的迭代器,時間復雜度為
O
(
log
?
N
)
O(\log N)
O(logN)。若不存在,則返回st.end()
#include#includeusing namespace std;
int main()
{setst;
for (int i = 1; i<= 3; i++)
{st.insert(i);
}
set::iterator it = st.find(2);
cout<< *it<< endl;
it = st.find(4);
if (it == st.end())
{cout<< "Not found"<< endl;
}
return 0;
}
erase()
??1.刪除單個元素:st.erase(it)
,it為所需要刪除元素的迭代器,可結合find()函數實現,時間復雜度
O
(
1
)
O(1)
O(1)。或者st.erase(value)
,value為所需要元素的值,時間復雜度
O
(
log
?
N
)
O(\log N)
O(logN)。
st.erase(st.find(100));
st.erase(100);
??2.刪除一個區(qū)間內的所有元素:st.erase(first,last)
,first為所需要刪除區(qū)間的起始迭代器,last為所需要刪除區(qū)間的末尾迭代器的下一個地址。
st.erase(st.find(100),st.end());//刪除元素30到末尾之間的元素
size()
??獲取set內元素的個數,時間復雜度
O
(
1
)
O(1)
O(1)。
clear()
??清空set中所有的元素,時間復雜度
O
(
N
)
O(N)
O(N)。
主要用途
定義
#include//注意string和string.h是不一樣的頭文件
string str;
string str="abcd";
元素訪問
string str="abcd";
cout<
string::iterator it;
string str="abcd";
for(it=str.begin();it!=str.end();it++)
{cout<<*it;
}
operatpr+=
??string的加法,可以將string直接拼接起來。
string str1="abc";
string str2="def";
string str3=str1+str2;//將str1和str2拼接,賦給str3
str1+=str2;//將str2直接拼接到str1上
compare operator
??兩個string類型可以直接使用==,!=,<,<=,>,>=比較大小,比較順序是字典序。
#include#includeusing namespace std;
int main()
{string str1 = "aa";
string str2 = "aaa";
string str3 = "abc";
string str4 = "xyz";
if (str1< str2) cout<< "ok1"<< endl;//ok1
if (str1 != str3) cout<< "ok2"<< endl;//ok2
if (str4 >= str3) cout<< "ok3"<< endl;//ok3
return 0;
}
length()/size()
??length()
返回字符串存放的字符數,時間復雜度為
O
(
1
)
O(1)
O(1),size()
與其用法基本相同。
insert()
insert(pos,string)
,在pos號位置插入字符串string,時間復雜度
O
(
N
)
O(N)
O(N)。string str="abcxyz",str2="opq";
str.insert(3,str2);
cout<
insert(it,it1,it2)
,it為原字符串欲插入的位置,it2和it3為待插字符串的首尾迭代器,用來表示串[it2,it3)將被插在it的位置上,時間復雜度
O
(
N
)
O(N)
O(N)。string str1="abcxyz",str2="opq";
str1.insert(str1.begin()+3,str2.begin(),str2.end());//abcopqxyz
erase()
erase(it)
,刪除單個元素,it為元素的迭代器,時間復雜度
O
(
N
)
O(N)
O(N)。erase(first,last)
,刪除區(qū)間內的元素,時間復雜度
O
(
N
)
O(N)
O(N)。erase(pos,length)
,pos為需要刪除的起始位置,length為要刪除的長度,時間復雜度
O
(
N
)
O(N)
O(N)。clear()
??清空string中的所有元素,時間復雜度
O
(
1
)
O(1)
O(1)。
substr()
??substr(pos,len)
返回從pos開始,長度為len的子串,時間復雜度為
O
(
l
e
n
)
O(len)
O(len)
string::npos
??它是一個常數,值為-1,用作find函數失配時的返回值。
find()
??str1.find(str2)
,當str2時str1的子串時,返回其在str中第一次出現的位置,否則返回string::npos。str1.find(str2,pos)
從str1的pos號開始匹配,返回值同上。時間復雜度
O
(
m
n
)
O(mn)
O(mn),m和n分別是str1和str2的長度。
replace()
??str1.replace(pos,len,str2)
把str1從pos號位置開始,長度為len的子串替換為str2。str1.replace(it1,it2,str2)
把str1的迭代器[it1,it2)范圍的子串替換為str2。
#include#includeusing namespace std;
int main()
{string str1 = "abcxyz";
string str2 = "opq";
str1.replace(3, 4, str2);
cout<< str1<< endl;//abcopq
str1.replace(str1.begin() + 1, str1.end(), str2);
cout<< str1<< endl;//aopq
}
2.4 map??map翻譯為映射,類似于hash表,能將某個類型的元素映射到另一個類型的元素。
定義
mapmp;
??其中前一個為鍵(key),后一個為值(value)。map中的鍵是唯一的。如下面的代碼:
mapmp;
mp['c']=20;
mp['c']=30;
最后c的映射應該為30,20被覆蓋掉。
元素訪問
??1.通過下標訪問。
??2.通過迭代器訪問。
因為map的每一對映射都有兩個typename,所以map可以使用it->first
和it->second
來分別訪問map中的key和value。
??另外,map中的元素會以鍵的次序從小到大自動排序,其內部使用紅黑樹實現。
find()
??find(key)
返回鍵為key的映射的迭代器,時間復雜度為
O
(
N
)
O(N)
O(N)。
#include#include
erase()/size()/clear()
??與前面大致相同,不再介紹。
map的常見用途
??queue翻譯為隊列,在STL中是一個先進先出的容器。
定義
queuename;
元素訪問
??由于queue本身是一種先進先出的限制性數據結構,因此只能通過front()
來訪問隊首元素,或back()
訪問隊尾元素。
#include#includeusing namespace std;
int main()
{queueq;
for (int i = 1; i<= 5; i++)
{q.push(i);//將i入隊
}
cout<< q.front()<< endl;//1
cout<< q.back()<< endl;//5
return 0;
}
push()
??push(x)
將x入隊,時間復雜度
O
(
1
)
O(1)
O(1)。
pop()
??pop()
將隊首元素出列,時間復雜度
O
(
1
)
O(1)
O(1)。
front()/back()
??分別獲得隊首元素和隊尾元素,時間復雜度
O
(
1
)
O(1)
O(1)。
empty()
??empty()
檢測queue是否為空,返回true則為空,返回false則非空,時間復雜度
O
(
1
)
O(1)
O(1)。
size()
??返回queue中元素的個數,時間復雜度
O
(
1
)
O(1)
O(1)。
queue常見用途
??稱為優(yōu)先隊列,其底層是用堆來實現的。在優(yōu)先隊列中,隊首元素一定是當前隊列中優(yōu)先級最高的那一個。
定義
priority_queuename;
元素訪問
??優(yōu)先隊列沒有front()和back(),只能通過top()函數訪問隊首元素,也稱堆頂元素。
#include#includeusing namespace std;
int main()
{priority_queueq;
q.push(3);
q.push(4);
q.push(1);
cout<< q.top()<< endl;//4
return 0;
}
push()/pop()/empty()/size()
??與queue相同,不再介紹。
優(yōu)先級的設置
priority_queueq;
priority_queue,less>;
priority_queue,greater>;
其中,第二個參數vector
是用來承載底層數據結構堆的容器,第三個參數則是對第一個參數的比較類,less
表示數字越大的優(yōu)先級越大,greater
表示數字越小優(yōu)先級越大。
struct fruit
{string name;
int price;
}
如果想要按照水果價格越高優(yōu)先級越高排序,則需要重載運算符"<":
struct fruit
{string name;
int price;
friend bool operator< (fruit f1,fruit f2)
{return f1.price< f2.price;//價格高優(yōu)先級高
}
}
注意,如果重載大于號會顯示編譯錯誤,因為從數學上來說只需重載小于號即可(aa,a==b等價于!(a同理,若想要以價格低的水果為優(yōu)先級高的次序輸出,只需要把return中的小于號改為大于號即可。
struct fruit
{string name;
int price;
friend bool operator< (fruit f1,fruit f2)
{return f1.price >f2.price;//價格低優(yōu)先級高
}
}
另外,還可以將函數寫在結構體外,即:
struct cmp
{bool operator () (fruit f1,fruit f2)
{return f1.price< f2.price;
{}
在這種情況下,需要使用第一種方法定義優(yōu)先隊列:
priority_queue,cmp>p;
常見用途
??priority_queue可以解決一些貪心問題,也可以對迪杰斯特拉算法進行優(yōu)化。
??stack翻譯為棧,在STL種是一個后進后出的容器。
定義
stackname;
元素訪問
??由于stack是一個后進后出的數據結構,所以只能通過top()來訪問棧頂的元素。
push()/top()/pop()/empty()/size()
??與前面大致相同,不再介紹。
常見用途
??stack常用來模擬實現一些遞歸,防止程序對棧內存的限制而導致程序運行出錯。
??pair將兩個元素綁在一起作為一個合成元素。
定義
#includepairname;
元素訪問
??pair中只有兩個元素,分別是first和second,只需按照正常結構體的方式去訪問即可。
比較操作數
??兩個pair類型數據可以直接使用“==”,“<=”等比較大小,比較規(guī)則是現以first的大小作為標準,只有當first相等時才會去判別second的大小。
常見用途
??用來代替二元結構體及其構造函數,節(jié)省編碼時間。還可以作為map的鍵值對進行插入,如:
mapmp;
mp.insert(make_pair("heihei",5));
mp.insert(pair("haha",10));
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
當前標題:【算法設計與分析】2.常見STL總結-創(chuàng)新互聯
分享地址:http://aaarwkj.com/article28/ccohjp.html
成都網站建設公司_創(chuàng)新互聯,為您提供靜態(tài)網站、營銷型網站建設、Google、網站導航、網站營銷、云服務器
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯