本文主要內(nèi)容如下:
成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供華龍網(wǎng)站建設(shè)、華龍做網(wǎng)站、華龍網(wǎng)站設(shè)計(jì)、華龍網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、華龍企業(yè)網(wǎng)站模板建站服務(wù),十年華龍做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。1.vector
1.1vector的定義
1.2vector容器內(nèi)元素的訪問(wèn)
1.3vector常用函數(shù)
2.set
2.1 set的定義
2.2set容器內(nèi)元素的訪問(wèn)
2.3set常用函數(shù)
3.string
3.1 string 的定義
3.2string容器內(nèi)元素的訪問(wèn)
3.3string 常用函數(shù)
4.map
4.1 map的定義
4.2 map容器內(nèi)元素的訪問(wèn)
4.3 map常用函數(shù)
5. queue
5.1 queue的定義
5.2 queue 容器內(nèi)元素的訪問(wèn)
5.3 queue 常用函數(shù)
5.4 queue常見(jiàn)用途
6.priority_queue
6.1 priority_queue的定義
6.2 priority_queue 容器內(nèi)元素的訪問(wèn)
6.3 priority_queue 常用函數(shù)
6.4 priority_queue內(nèi)元素優(yōu)先級(jí)的設(shè)置
7. stack
7.1stack的定義
7.2stack容器內(nèi)元素的訪問(wèn)
8. pair
8.1 pair的定義
8.2 pair中元素的訪問(wèn)
8.3 pair常用函數(shù)
8.4 pair常見(jiàn)用途
9. algorithm頭文件
向量,長(zhǎng)度可變的數(shù)組
頭文件
#include<vector>
vector<typename> name;
例如:
vector<int> name;
如果typename是vector
vector<vector<int>>name;
相當(dāng)于二維數(shù)組
vector<typename> ArrayName[arraySize];
例如:
vector<int> vi[100];
(1)通過(guò)下標(biāo)訪問(wèn)
vi[index];
(2)通過(guò)迭代器訪問(wèn)
vector<typename>::iterator it;
例如:
vector<int>::iterator it;
有上下文環(huán)境時(shí),可以直接用 auto it=vi.begin();
例如:
for(auto it=vi.begin();it!=vi.end();it++)
printf(“%d”,*it);
注:vi.begin()和vi.end()左閉右開(kāi)。
(1)push_back()
在末尾添加一個(gè)元素。
vi.push_back(i);
(2)pop_back()
刪除一個(gè)尾元素。
vi.pop_back();
(3)size()
返回vector元素的個(gè)數(shù),注意是unsigned類(lèi)型。
vi.size();
(4)clear()
清空vector中所有的元素。
vi.clear();
(5)insert()
insert(it,x)在迭代器it前插入一個(gè)元素x。
vi: 1 2 3 4 5
vi.insert(vi.begin()+2,-1);
vi:1 2 -1 3 4 5
(6)erase()
1.刪除單個(gè)元素
vi:5 6 7 8 9
vi.erase(vi.begin()+3)
vi:5 6 7 9
2.刪除一個(gè)區(qū)間內(nèi)的所有元素
erase[first,last); 左閉右開(kāi)
vi:5 6 7 8 9
vi.erase(vi.begin()+1,vi.begin+4)
vi:5 9
集合,一個(gè)內(nèi)部自動(dòng)有序且不含重復(fù)元素的容器
頭文件
#include<set>
set<typename> name;
例如:
set<int> name;
set數(shù)組
set<typename>ArrayName[arraySize];
例如:
set<int> a[100];
set只能用迭代器訪問(wèn)
set<typename>::iterator it;
例如:
set<int>::iterator it;
set<int> st;
for(auto it=st.begin();it!=st.end();it++)
print(“%d”,*it);
st:2 3 5
set元素自動(dòng)遞增排序,且自動(dòng)去除重復(fù)元素。
注意:不能用it<st.end();
除了vector和string容器外不能用*(it+i)
(1)insert()
insert(x)將x插入set容器中,并自動(dòng)遞增排序和去重。
st.insert(x)
(2)find()
find(value)返回set中對(duì)應(yīng)值為value的迭代器。
set<int>::iterator it = st.find(2);
(3)erase()
1.刪除單個(gè)元素
st.erase(it); //it 為迭代器
st.erase(find(100));
st.erase(value),value 為所要?jiǎng)h除元素的值。
st.erase(100);
2.刪除區(qū)間內(nèi)所有元素
erase[first,last); 左閉右開(kāi)
st.erase(first,last);
st.erase(it,st.end());
(4)size()
返回set內(nèi)元素的個(gè)數(shù),unsigned類(lèi)型
(5)clear()
清空set內(nèi)所有的元素
字符串?dāng)?shù)組
string str=”abcd”;
(1)通過(guò)下標(biāo)訪問(wèn)
str[index];
輸出str
cout<<str;
printf(“%s”,str.c_str());
(2)通過(guò)迭代器訪問(wèn)
string迭代器不需要參數(shù)
string::iterator it;
for(it=str.begin();it!=str.end();it++)
printf(“%c”,*it);
(1)operator+=
str1+=str2;
(2)compare operator
可直接使用 == ,!=,<=,<,>,>=比較大小,比較規(guī)則是字典序
(3)length()/size()
返回字符串長(zhǎng)度,兩者基本相同。
(4)insert()
1.insert(pos.string);
在pos號(hào)位置插入字符串string
string str1=”abcxyz”;
string str2=”opq”;
str1.insert(3,str2);
str1:abcopqxyz
2.insert(it,it2,it3); //it為原字符串待插入位置,it2,it3位待插入字符串首尾迭代器。[it2,it3) 左開(kāi)右閉
string str1=”abcxyz”;
string str2=”opq”;
str1.insert(str1.begin()+3,str2.begin(),str2.end())
str1:abcopqxyz
(5)erase()
1.刪除單個(gè)元素
str.erase(it) //it為所要?jiǎng)h除元素位置的迭代器
2.刪除一個(gè)區(qū)間內(nèi)的所有元素
(1)str.erase(first,last); [first,last)左開(kāi)右閉
string str=”abcdefg”;
str.erase(str.begin()+2,str.end()-1);
str:abg
(2)str.erase(pos,length);
pos為起始位置,刪除后面長(zhǎng)度為length的字符串。
string str=”abcdefg”;
str.erase(3,2);
str:abcfg
(6)clear()
str.clear(); 清空字符串
(7)substr()
substr(pos,len); 返回從pos號(hào)位開(kāi)始、長(zhǎng)度為len的子串。
string str=”Thank you for your smile”;
str.substr(0,5);
Thank
str.substr(14,4);
your
str.substr(19,5);
smile
(8)string::npos
string::npos是一個(gè)常數(shù),其本身值為-1,unsigned_int類(lèi)型,作為find函數(shù)失配時(shí)的返回值。
(9)find()
str1.find(str2); 當(dāng)str2是str1的子串時(shí),返回str2在str1中第一次出現(xiàn)的位置;如果str2不是str1的子串,返回string::npos。
str1.find(str2,pos); 從str1的pos號(hào)位開(kāi)始匹配str2,返回值與上文相同。
string str1=”Thank you for your smile”;
string str2=”you”;
string str3=”me”;
cout<<str1.find(str2);
6
cout<<str1.find(str2,7);
14
(10)replace()
1.str1.replace(pos,len,str2); 把str1從pos號(hào)位開(kāi)始、長(zhǎng)度為len的子串替換為str2.
2.str1.replace(it1,it2,str2); 把str1的迭代器[it1,it2)范圍的子串替換成str2.
string str1=”Maybe you will turn around”;
string str2=”will not”;
striing str3=”surely”;
cout<<str1.replace(10,4,str2);
Maybe you will not turn around
cout<<str1.replace(str1.begin(),str1.begin()+5,str3);
surely you will not turn around
映射,map可以將任何基本類(lèi)型(包括STL容器)映射到任何基本類(lèi)型(包括STL容器)。
例如:
字符串-->頁(yè)碼。
頭文件
#include<map>
map<typename1,typename2> mp;
map<key,value> mp;
map<int,int> mp 相當(dāng)于普通的int型數(shù)組。
如果是字符串到整型的映射,必須用string,不能用char數(shù)組。
map<string,int> mp;
map的鍵和值也可以是STL容器。
例如:
map<set<int>,string> mp;
1.通過(guò)下標(biāo)訪問(wèn)
與訪問(wèn)普通數(shù)組一樣,例如
map<char,int> mp;
mp[‘c’]來(lái)訪問(wèn)它對(duì)應(yīng)的整數(shù)。
mp[‘c’]=20;
注:map的鍵值是唯一的。
2.通過(guò)迭代器訪問(wèn)
map<typename1,typename2>::iterator it;
用it->first訪問(wèn)鍵
用it->second訪問(wèn)值
map<char,int>mp;
mp[‘m’]=20;
mp[‘r’]=30;
mp[‘a(chǎn)’]=40;
for(auto it=mp.begin();it!=mp.end();it++)
printf(“%c %d\n”,it->first,it->second);
map會(huì)按鍵值從小到大自動(dòng)排序。
(1)find()
find(key)返回鍵值為key的映射的迭代器。
auto it = mp.find(‘c’);
(2)erase()
1.刪除單個(gè)元素。
mp.erase(it); it為迭代器。
mp.erase(key); key為欲刪除的映射的鍵。
2.刪除一個(gè)區(qū)間內(nèi)的所有元素。
map.erase(first,last) [first,last) 刪除迭代器區(qū)間,左閉右開(kāi)。
(3)size()
返回map中映射的對(duì)數(shù)。
(4)clear()
清空map中所有的元素。
隊(duì)列,一個(gè)先進(jìn)先出的容器。
頭文件
#include<queue>
queue<typename> name;
queue是一種先進(jìn)先出的限制訪問(wèn)的數(shù)據(jù)結(jié)構(gòu)。
只能front()訪問(wèn)隊(duì)首元素,back()訪問(wèn)隊(duì)尾元素。
queue<int> q;
q.front();
q.back();
(1)push()
q.push(x)將x進(jìn)行入隊(duì)
(2)front() / back()
訪問(wèn)隊(duì)首和隊(duì)尾元素。
(3)pop()
q.pop()令隊(duì)首元素出隊(duì)。
(4)empty()
檢測(cè)queue是否為空,返回true為空,返回false則非空。
(5)size()
返回queue內(nèi)元素的個(gè)數(shù)。
例如廣度優(yōu)先搜索。
優(yōu)先隊(duì)列,底層用堆來(lái)實(shí)現(xiàn)。在優(yōu)先隊(duì)列中,隊(duì)首元素是當(dāng)前隊(duì)列中優(yōu)先級(jí)最高的一個(gè)。
頭文件
#include<queue>
priority_queue<typename> name;
只能用q.top()函數(shù)訪問(wèn)。
(1)push()
q.push(x)將x入隊(duì)。
(2)top()
q.top()可以獲得隊(duì)首元素。
(3)pop()
令隊(duì)首元素(堆頂元素)出隊(duì)。
q.pop();
(4)empty()
檢測(cè)優(yōu)先隊(duì)列是否為空,為空則返回true,返回false為空。
(5)size()
返回優(yōu)先隊(duì)列內(nèi)元素的個(gè)數(shù)。
1.基本數(shù)據(jù)類(lèi)型的優(yōu)先級(jí)設(shè)置
基本數(shù)據(jù)類(lèi)型指int、double、char型等數(shù)據(jù)類(lèi)型。
下面兩種優(yōu)先隊(duì)列的定義是等價(jià)的。
priority_queue<int> q;
priority_queue<int,vector<int>,less<int> > q;
vector<int> 是來(lái)承載底層數(shù)據(jù)結(jié)構(gòu)堆(heap)的容器,而less<int>是比較類(lèi)。
less<int> 表示數(shù)字大的優(yōu)先級(jí)越大,而greater<int>表示數(shù)字小的優(yōu)先級(jí)越大。char類(lèi)型按字典序。
2.結(jié)構(gòu)體的優(yōu)先級(jí)設(shè)置
需要重載比較符號(hào)。
例如:
struct fruit{
string name;
int price;
friend bool operator<(fruit f1,fruit f2){
return f1.price<f2.price;
}
};
判斷f1==f2,則相當(dāng)于!(f1<f2)&&!(f2<f1)。
所以 priority_queue<fruit> q; 內(nèi)部以?xún)r(jià)格高的水果優(yōu)先級(jí)高。
同理,如果想以?xún)r(jià)格低的水果為優(yōu)先級(jí)高,那么把<改成>。
struct fruit{
string name;
int price;
friend bool operator<(fruit f1,fruit f2){
return f1.price>f2.price;
}
};
注:只能重載<,重載>會(huì)編譯錯(cuò)誤。
不用greater<typename>,不重載<,不用friend函數(shù)
用cmp。
#include<iostream>
#include<queue>
#include<string>
using namespace std;
struct fruit{
string name;
int price;
}f1,f2,f3;
struct cmp{
bool operator () (fruit f1,fruit f2){
return f1.price>f2.price;
}
};
int main()
{
priority_queue<fruit,vector<fruit>,cmp> q;
f1.name="a";
f1.price=3;
f2.name="b";
f2.price=2;
f3.name="c";
f3.price=1;
q.push(f1);
q.push(f2);
q.push(f3);
cout<<q.top().name<<" "<<q.top().price;
return 0;
}
結(jié)果: c 1
即便是基本數(shù)據(jù)類(lèi)型或其他STL容器(如set),也可以用同樣的方式定義優(yōu)先級(jí)。如果結(jié)構(gòu)體內(nèi)數(shù)據(jù)較龐大,前面加const & 引用來(lái)提高效率。
friend bool operator<(const & fruit f1,const & fruit f2){
return f1.price>f2.price;
}
struct cmp{
bool operator () (const & fruit f1,const & fruit f2){
return f1.price>f2.price;
}
};
priority_queue的本質(zhì)是堆。
棧,一個(gè)后進(jìn)先出的容器。
頭文件
#include<stack>
stack<typename> name;
由于棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),所以只能用top()來(lái)訪問(wèn)棧頂元素。
st.top();
(1)push()
st.push(x)將x入棧
(2)top()
st.top()訪問(wèn)棧頂元素。
(3)pop()
st.pop()刪除棧頂元素。
(4)empty()
st.empty()檢測(cè)是否為空,為空返回true,否則返回false。
(5)size()
st.size()返回棧中元素的個(gè)數(shù)。
當(dāng)想要將兩個(gè)元素綁在一起作為一個(gè)合成元素,又不想定義結(jié)構(gòu)體時(shí),可以使用pair。
頭文件
#include<utility>
map實(shí)現(xiàn)用了pair,所以#include<map>包含#include<utility>,用map不需要再包含utility頭文件。
pair 相當(dāng)于
struct pair{
typeName1 first;
typeName2 second;
};
pair<typeName1,typeName2> name;
例如:
pair<string ,int> p;
初始化:
pair<string ,int> p(“haha”,5);
pair<string,int> p=make_pair(“haha”,5);
用p.first和p.second訪問(wèn)。
(1)比較操作數(shù),pair可以直接使用==,!=,<,<=,>,>=比較大 小。
比較規(guī)則是先以first的大小作為標(biāo)準(zhǔn),只有當(dāng)first相等時(shí)才 去比較second的大小。
例如:
#include<iostream>
#include<map>
using namespace std;
int main(){
map<string,int>mp;
mp.insert(make_pair("heihei",5));
mp.insert(pair<string,int>("haha",10));
//auto it ==map<string,int>::iterator it
for(auto it = mp.begin();it!=mp.end();it++)
cout<<it->first<<" "<<it->second<<endl;
return 0;
}
(1)max() /min()/abs()
max和min返回兩個(gè)數(shù)x、y中的大最小值。abs(x)中x必須為整數(shù),浮點(diǎn)數(shù)用math頭文件下的fabs()。
(2)swap()
swap(x,y)交換x和y的值。
(3)reverse()
reverse(it,it2)可以將數(shù)組指針在[it1,it2)之間的元素或容器的迭代器[it1,it2)范圍內(nèi)的元素進(jìn)行反轉(zhuǎn)。
例如:
int a[10]={10,11,12,13,14,15};
reverse(a,a+4); //將a[0]~a[3} 4個(gè)元素反轉(zhuǎn)。
13 12 11 10 14 15
string str =“abcdefghi”
reverse(str.begin()+2,str.begin()+6);
abfedcghi
(4)next_permutation()
next_permutation()給出一個(gè)序列在全排列中的下一個(gè)序列。
例如:
n=3的全排列為
123 132 213 231 312 321
231的下一個(gè)序列為312。
int a[10]={1,2,3};
do{
cout<<a[0]<<a[1]<<a[2]<<” ”;
}while(next_permutation(a,a+3));
輸出:123 132 213 231 312 321
(5)fill()
fill()可以把數(shù)組或某容器的某一段區(qū)間賦為某個(gè)相同的值,與memset不同,這里的賦值可以是數(shù)組類(lèi)型對(duì)應(yīng)范圍中的任意值。
int a[5];
fill(a,a+5,233);
(6)sort()
sort(a,a+4); //默認(rèn)遞增排序
cmp函數(shù)
bool cmp(int a,int b){
return a>b; //從大到小排序 與priority_queue相反。
}
結(jié)構(gòu)體
struct node{
int x;
int y;
}
bool cmp(node a,node b){
if(a.x!=b.x)
return a.x>b.x; //按x從大到小排序 與priority_queue相反。
else
return a.y<b.y; //若x相等,則按y從小到大排序。
}
STL中,只有vector,string,deque是可以用sort的,像set、map容器是用紅黑樹(shù)實(shí)現(xiàn)的,元素本身有序,不允許用sort排序。
(7)lower_bound()/upper_bound()
lower_bound(first,last,val)用來(lái)尋找在數(shù)組或容器中的[first,last)范圍內(nèi)第一個(gè)值大于等于val的元素的位置,如果是數(shù)組,返回該位置指針;如果是容器,返回該位置的迭代器。
upper_bound(first,last,val)用來(lái)尋找數(shù)組或容器的[first,last)范圍第一個(gè)值大于val的元素的位置,如果是數(shù)組,返回該位置指針;如果是容器,返回該位置的迭代器。
如果數(shù)組或容器中沒(méi)有尋找到該元素,則lower_bound()和upper_bound()返回可以插入該元素的位置的指針或迭代器。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前題目:C++STL筆記-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://m.newbst.com/article12/deoodc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、用戶(hù)體驗(yàn)、網(wǎng)站營(yíng)銷(xiāo)、小程序開(kāi)發(fā)、品牌網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容