STL的常見用法(1)
阿新 • • 發佈:2018-12-22
1.vector 定義:vector<typename> name;
typename 表示可以是任何基本型別,int, doubel, char, 結構體,也可以是STL標準容器,例如vector, set, queue 等。
例如:vector<vector<int> > name;相當於一個二維陣列只不過這個是變長的。
2.vector 容器內元素的訪問;一般有兩種形式@1:下標訪問,@2:通過迭代器訪問。
迭代器(iterator)可以理解為一種類似指標的東西,定義:vector<typename>::iterator it;可以通過*it來訪問vector裡面的元素。
int main(){ ios::sync_with_stdio(false); vector<int>v; for(int i = 1; i <= 5; i++){ v.push_back(i); } vector<int>::iterator it = v.begin(); for(int i = 0; i < 5; i++){ printf("%d ",*(it + i)); } printf("\n"); for(int i = 0; i < 5; i++){ printf("%d ",v[i]); } printf("\n"); for(vector<int>::iterator it = v.begin(); it != v.end(); it++){ printf("%d ", *it); } return 0; }
在常用STL容器中,只有在vector和string中,才允許使用v.begin() + 3這種迭代器加上整數的寫法。
int main(){ ios::sync_with_stdio(false); vector<int>v; for(int i = 1; i <= 5; i++){ v.push_back(i); } v.insert(v.begin() + 2, -1); //用來向vector的任意迭代器it插入一個元素x,時間複雜度o(n) //v.pop_back();//pop_back()用來刪除vector尾元素。size()獲得vector中元素個數 //erase()有兩種用法,刪除單元格,刪除一個區間[)的所有元素,時間複雜度為o(n) //v.erase(v.begin() + 3); //for(int i = 0;i < v.size(); i ++){ // printf("%d ",v[i]); //} v.erase(v.begin()+1,v.begin()+2); for(int i = 0;i < v.size(); i ++){ printf("%d ",v[i]); } printf("\n"); //v.clear();//清空vector中所有元素 //printf("%d\n",v.size()); return 0; }
set的常見用法:
set的定義:set<typename> name;定義賀vector的一樣。大部分stl都是這樣定義的。
set元素的訪問;由於除開vector和string之外的stl容器都不支援*(it+i)的訪問形式。
int main(){
set<int>s;
s.insert(3);//insert(x)將x插入set容器中,並且自動排序和去重時間複雜度o(logn)
s.insert(5);
s.insert(2);
s.insert(3);
s.insert(6);
s.insert(7);
for(set<int> :: iterator it = s.begin(); it != s.end(); it++){
printf("%d ",*it);
}
printf("\n");
//find()函式返回set中對應為value的迭代器,時間複雜度為olog(n)
printf("%d\n",*(s.find(5)));
//erase()函式有兩種用法:刪除單個元素,刪除一個區間內的所有元素;
//刪除單個元素有兩種方法刪除迭代器,或者直接刪除value.
//s.erase(s.find(2));
//s.erase(2);
//區間刪除[);
//size()返回set內元素的個數。時間複雜度o(1)
printf("%d\n",s.size());
s.erase(s.find(3),s.end());
for(set<int> :: iterator it = s.begin(); it != s.end(); it++){
printf("%d ",*it);
}
printf("\n");
//clear()清空set的所有元素時間複雜度o(n)
s.clear();
printf("%d\n",s.size());
return 0;
}
使用find函式要判斷元素是否存在只是要使用迭代器:
set<int>s;
for(int i = 1; i <= 5; i++)s.insert(i);
set<int>::iterator iter;
iter = s.find(5);
if(iter!=s.end()){
cout << *(s.find(5)) << endl;
}else{
cout << "no thanks" << endl;
}
set中元素是唯一的,如果需要處理不唯一的情況,則可以使用multiset。另外還增加了unordered_set,以散列表代替set內部的紅黑數。可以用來處理只去重不排序的需求,速度比set快的多。
string的常見用法:
string的定義:string str;
int main(){
string str, str2, str3;
//如果要讀入和輸出整個字串,則只能用cin和cout;
//可以使用c_str()來用printf()輸出字串,把字串轉化為字元陣列;
//cin >> str;
//printf("%s\n",str.c_str());
//string可以使用+法可以直接比較大小。
//length()//size()返回字串的長度
//insert()時間複雜度o(n)
//insert(pos, string);在Pos號位置插入字串string
//insert(it, it2, it3); it為原字串,it2,it3為待插字串的首尾迭代器用來表示[it2, it3)將被插入在it位置上
//cin >> str2 ;
//str3 = str2 + str;
//cout << str3 << endl;
//str3.insert(3,str2);
//cout << str3 << endl;
//cout << str3.length() << " " << str3.size() << endl;
//str = "wefgy";
//str2 = "fguy";
//erase()函式刪除單個元素,刪除一個區間內的所有元素。時間複雜度均為o(n).
//cin >> str >> str2;
//str2.insert(str2.begin()+3,str.begin(),str.end());
//cout << str2 << endl;
cin >> str;
//str.erase(str.begin()+2);
//cout << str << endl;
//刪除一個區間內的所有元素[first, last)
//str.erase(str.begin()+2, str.end()-1);//迭代器法
str.erase(3,2);//刪除從第三個元素開始的兩個字元;
//clear()函式用以清空string中的資料,時間複雜度o(1)
str.clear();
//substr()函式substr(pos,len)返回從POS位置開始,長度為len的子串時間複雜度為o(len)
//cout << str.length() << endl;
//cout << str << endl;
str2 = "Thank you for your smile";
cout << str2.substr(0,5) << endl;
return 0;
}
在這裡主要說明find()函式和string::npos的使用;
int main(){
//string str = "Thank you for your smile";
//string str2 = "you";
//string str3 = "me";
//string::npos
//string::npos是一個常數,其本身的值為-1,但是由於是unsigned_int型別,因此實際上也可以認為是unsigned_int型別的最大值。
//string::npos用以作為find函式失配時的返回值。主要結合find()函式來使用;
//find(str2)函式返回其在str中第一次出現的位置如果不存在str2返回string::npos;
//find(str2, pos)從str的pos號位開始匹配str2,返回值與上相同
//if(str.find(str2) != string::npos){
// cout << str.find(str2) << endl;
//}
//if(str.find(str2,7) != string::npos){
// cout << str.find(str2, 7) << endl;
//}
//replace()
//replace(pos,len,str2)把str從pos位置開始。長度為len的子串替換為str2.
//replace(it1,it2,str2)把str的迭代器[it1,it2)範圍的子串替換為str2;時間複雜度為o(str.length())
string str = "Maybe you will turn around";
string str2= "will not";
string str3 = "surely";
cout << str.replace(10, 4, str2) << endl;
cout << str.replace(str.begin(),str.begin()+5,str3) << endl;
return 0;
}