STL學習(三)

STL之旅,概論

1、STL Componets

構成STL的組件

1)     容器(Containers

用來管理某類對象的集合,可以是Arrayslinked lists,或者每個元素都有一個Key

分類:

序列式容器:每個元素有固定的位置vector,deque,list

關聯式容器:位置取決於對元素值取特定排序準則的算法,通常用binary tree來實現。set,multiset,map,multimap

2)     迭代器(Iterators)

用來在一個對象集(容器)的元素上進行遍歷動作,迭代器類似於smart pointer使用operator++可以累進(取得哪個羣集對象取決於對應的容器),使用operator*可訪問對象。

3)     算法( Algorithms )

通過使用迭代器可以將搜尋、排序、修改等算法只實現一次就能獲得對任意容器進行操作的能力。

 

2、泛型程序設計 generic programming

3、STL Componets之容器

1)  Vector:將元素放到dynamic array中管理,允許隨機存儲,在Array的尾部添加和刪除元素特別快,但在其它位置安插元素就費事。

基本使用方法:

#include <iostream>

#include <vector>

using namespace std;

int main()

{

vector<int> coll;

for(int I=1;I<=6;I++)

{

coll.push_back(i);

}

for(I=0;I<coll.size();I++)

{

cout<<coll[I]<<’,’;

}

cout<<endl;

return 0;

}

2)     Dequedouble-ended queue):也是dynamic array,但可以向兩端發展。

基本使用方法:

#include <iostream>

#include <deque>

using namespace std;

int main()

{

deque<int> coll;

for(int I=1;I<=6;I++)

{

coll.push_front(I);

coll.push_back(I*10);

}

for(I=0;I<coll.size();I++)

{

cout<<coll[I]<<’,’;

}

cout<<endl;

return 0;

}

3)     List(double linked list):不提供隨機存儲,但是在任何地方插入刪除元素是特別快的。

#include <iostream>

#include <list>

using namespace std;

int main()

{

list<int> coll;

for(int I=1;I<=6;I++)

{

coll.push_back(i);

}

while(!coll.empty())

{

cout<<coll.front()<<”,”;//不能用operator[]

coll.pop_front();

}

cout<<endl;

return 0;

}

 

4)     Set/Multiset:內部元素根據其值自動排列,set不允許有重複元素出現,multiset允許重複。

5)   Map/Multimap:內部元素爲Key/Value PairsKey是排序準則的基礎,MapKey只能出現一次,multimap中允許多次出現。

 

4、STL Componets之迭代器:迭代器是“可遍歷STL容器內全部或部分元素”的對象。

1)     其基本操作有:這些操作和C++操作指針操作類似

operator*

operator++

operator==,operator!=

operator=

2)     每個容器都用嵌套的方式提供自己的迭代器,所有的容器都提供一些成員函數,使我們獲得迭代器以訪問容器內對象。

bgin():返回一個指向容器起點的迭代器

end():返回一個指向容器結束點的迭代器

使用方法:

如果是對list進行遍歷那麼情況如圖:

set進行遍歷:

#include <iostream>

#include <set>

using namespace std;

int main()

{

typedef set<int> IntSet;

IntSet coll;

coll.insert(3);

coll.insert(1);

coll.insert(5);

coll.insert(4);

coll.insert(1);

coll.insert(6);

coll.insert(2);

 

IntSet::const_iterator pos;//有兩種iteraotr,container::iteratorcontainer::const_iterator

for(pos=coll.begin();pos!=coll.end();++pos)

{

cout<<*pos<<”,”;

}

cout<<endl;

return 0;

}

//////////////////////////////////////////////////////////////////

typedef set<int> IntSet ó typedef set<int,greater<int> > IntSet

其中greater<>爲預定義的仿函數(function object)它能對set內元素按照其值進行順序排序。

在第一個圖中,雖然我們插入了兩次1但實際上只存儲一個1。在圖二中迭代器是以自己對容器理解的方式遍歷其內部的對象。

 

5、STL Componets之算法

算法並非容器類別的成員函數,而是一種搭配迭代使用的全局函數。這樣只要所有算法有一份那麼就可以對所有的容器進行操作,不必每個容器要量身定做。

OOP:數據與操作結合

GP:數據與操作劃分開,通過接口互動。

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

int main()

{

vector<int> coll;

vector<int>::iterator pos;

 

coll.push_back(2);

coll.push_back(5);

coll.push_back(4);

coll.push_back(1);

coll.push_back(6);

coll.push_back(3);

 

pos=min_element(coll.begin(),coll.end());

cout<<”min:”<<*pos<<endl;

pos=max_element(coll.begin(),coll.end());

cout<<”max:”<<*pos<<endl;

 

sort(coll.begin(),coll.end());

pos=fine(coll.begin(),coll.end(),3);

reverse(pos,coll.end());

 

for(pos=coll.begin();pos!=coll.end();++pos)

{

cout<<*pos<<” “<<endl;

}

cout<<endl;

return 0;

}

區間:所有算法都用來處理一個或多個區間的元素,我們必須將區間用迭代器表示並傳給算法。所有算法處理的都是半開區間[begin,end)。對區間處理時也與C++指針一樣必須得小心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章