本文結合小紫書總結STL在ACM競賽中的使用
1.stringstream字元流,和string類型:
string類具有的優點:可以直接用四則運算符和關系運算符,簡化了字元串類型的操作。
string string1="22",string2="11";
string1+=string2; //類似于strcat
int length=string1.length(); //類似于strlen,也可以用string.size();
bool judge=string1>string2; //類類似于strcmp
小紫書中例代碼詳解:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(void){
string str;
stringstream ss;
while(getline(cin,str)){ //getline函數的傳回值是其中的流cin。一旦cin讀取錯誤就是false。
ss<<str; //将string送入流中。
int a,sum=0;
while(ss >> a) sum+=a; //當流裡沒有東西的時候,退出循環。
cout<<sum<<endl;
}
return 0;
}
2.模闆:
模闆是為了,使類或者函數具有通用型,不僅限于一種資料類型或者一種成員結構。
現定義一個可以任意交換類型的模闆(注意模闆隻能在全局或者命名空間内定義,不可以在main函數或者自定義函數内定義。)
template<class &T> //class為固定關鍵字,也可以用等效的typename.
void swap1(T &a,T &b){
T temp;
temp=a;
a=b;
b=temp;
}
3. 容器vector:
vector<int> v;
v.begin(); //容器的起始位置
v.end(); //容器最後一個位置後的位置
v.front();v.back(); //傳回第一個元素(最後一個元素,但不判斷時候存在
v.empty(); //傳回是否容器為空
v.clear(); //清空容器
v.erase(m); //删除m位置的資料,并傳回下一個資料的位址(m是疊代器)
v.erase(m,n); //删除m到n之間的資料,并傳回下一個資料的位址
v.push_back(element); //壓入一個元素到末端
v.pop_back(); //彈出最後一個元素
v.reserve(100);v.resize(101); //resize已經建立空間如果再v.push_back();空間就會到101,而reserve隻是預留白間并沒有真正建立,v.push_back();隻是在第1位
v.size();v.capacity(); //size表示的是已經建立的空間大小也可以表示元素個數可用v[]的形式直接通路,capacity容器容量,是預留白間并沒有實際建立
swap(a,b); //交換兩個元素的位置如:swap(v[0],v[1]);
vector<int> v(10); //建立一個前十個元素為int的容器
vector<string> v(10,string("I")); //使容器的前10個元素都為string型,并且都初始化為I
vector<string> v1(v2); //對于已經存在的v2建立一個v1副本
v.insert(place,element);
v.insert(place,n,element); //在place(疊代器)位插入n個元素
注:對vector元素的通路可以用類似c語言的v[],但是最好用v.at(),它會檢查是否越界更安全
總結:vector即具有數組的特性由增加了一些功能十分好,簡化代碼的函數,還可以通過原生的v.push_back()動态增加長度,十分好用。
4.集合set(特點是不會存在有重複的元素):
#include<set>
set<int> s; //建立一個整型集合:s
s.insert(element); //插入一個元素,并會自動排序(在沒有自定義的情況下,預設升序排列)
s.size(); //目前容器中元素個數
copy(s.begin(), s.end(), ostream_iterator<string>(cout, "\n")); //#include<iterator> 中的函數:輸出全部集合中的元素,并在每個元素後面接換行符
5.映射map(關聯容器):
#include<map>
map<string,int> map1; //建立一個map類型,健(key)為string型,值(value)為int型。是健到值得一種映射。
map1.insert(pair<string,int>("month",1)); //插入一個元素
map1["month"]=1; // 插入一個元素
<span id="transmark">map1.find("month") //查找該健,如果沒有找到傳回最後一位元素後面的疊代器
map1.count("month") //查找健"month"出現的次數,但是map中健都是單一且按照升序排列的,隻有0和1兩中情況
//因為map在建立的時候是有序的,是以查找效率是:logn。1,000個資料隻需10次查找,1.000,000也不過20次查找
</span>
6.棧stack:
#include<stack>
stack<int> stack1; //在是預設以deque為容器的
stack1.push(element);
stack1.pop();
stack1.empty(); //是否為空
stack1.size(); //元素個數
stack1.top(); //判斷是否為棧頂元素
7.隊列queue:
#include<queue>
queue<int> queue1;
queue1.push(element); //加入隊列頂部
queue1.pop(); //彈出隊列裡第一個元素
queue1.back(); //隊列最後一個元素
queue1.front(); //隊列第一個元素
queue1.size(); //隊列元素個數
queue1.empty; //隊列是否為空
8.優先隊列priority_queue:
#include<queue>
priority_queue<int,vector<int>,less<int>> pqueue1; //預設容器為vector,其中less算子,表示小的先出隊
priority_queue<int,vector<int>,greater<int>> pqueue1; //大的先出隊
//優先隊列與隊列相比,隻是按照指定的算子将隊列内部排序,讓後在操作排序後的棧頂元素。<span id="transmark"></span>
9.二進制組pair:
#include<iostream>
pair<int,int> palce; //定義一個二進制組。
palce.first=1;
palce.second=2;
//對于pair類可以直接用關系運算符,比較規則是:先對第一個元素比較,若第一個元素相等再對第二個元素比較。
//由于可以用比較運算符,可以把pair作為vector的元素,再用sort排序<span id="transmark"></span>
10.全排列函數:next_permutation
#include<algorithm>
//要求一個元素全不相同的長度為n的排列的個數是n!個,方法是:先把排列升序排列,然後求,直到next_permutation()的傳回值為false(next_permutaion()已經是最後一個排列之後會傳回false,其餘傳回true,如果傳回最後一個之還在繼續使用就會循環到第一個。)
char a[9]={1,2,3,32,36,56,34,24};
sort(a,a+8);
do{
cout << a <<endl;
}while(next_permutation(a,a+8));
//求前一個全排列:prev_permutation()