天天看點

STL在ACM競賽中的使用      本文結合小紫書總結STL在ACM競賽中的使用

      本文結合小紫書總結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()
           

繼續閱讀