STL之旅,概論
1、STL Componets
構成STL的組件
1) 容器(Containers)
用來管理某類對象的集合,可以是Arrays或linked 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) Deque(double-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 Pairs,Key是排序準則的基礎,Map中Key只能出現一次,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::iterator和container::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++指針一樣必須得小心。