1. 程式人生 > >C++標準模板庫(STL)的簡單知識點

C++標準模板庫(STL)的簡單知識點

一.STL簡介

1.簡介

STL<標準模板庫>是通用類模板和演算法的集合,他提供給程式設計師一些標準的資料結構的實現。

2.三類資料結構 

1.順序性容器

vector 從後面快速的插入與刪除,直接訪問任何元素

deque 從前面或後面快速的插入與刪除,直接訪問任何元素

list 雙鏈表,從任何地方快速插入與刪除

2.關聯容器

set 快速查詢,不允許重複值

multiset 快速查詢,允許重複值

map 一對多對映,基於關鍵字快速查詢,不允許重複值

multimap 一對多對映,基於關鍵字快速查詢,允許重複值

3.容器介面卡

stack 後進先出

queue 先進先出

priority_queue 最高優先順序元素總是第一個出列 

二.順序性容器

1.C++ Vector(向量容器)

1).特點

1.看作動態陣列,指定一塊如同陣列一樣的連續儲存,但空間可以動態擴充套件

2.隨機訪問方便

3.連續儲存節省空間

4.內部插入、刪除效率低下,只能在後端進行追加和刪除

5.動態新增的資料超過vector預設分配的大小進行記憶體重新分配、拷貝和釋放,操作非常消耗效能

2)語法

1. Constructors 建構函式

vector<int> v1; //構造一個空的vector

vector<int> v1( 5, 42 ); //構造了一個包含5個值為42的元素的Vector 

2.at() 返回指定位置的元素

TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全;

3.empty() 判斷Vector是否為空(返回true時為空)

4. pop_back() 移除最後一個元素 

5.push_back() 在Vector最後新增一個元素 

2.C++ List (雙向連結串列)

1)特點

1.不使用連續的記憶體空間,隨意進行動態操作

2.任何位置快速進行插入和刪除

3.不能進行內部的隨機訪問,不支援[ ]操作符和vector.at()<返回指定位置的元素>;

2)語法

1.assign() 給list賦值

void assign( input_iterator start, input_iterator end ); //以迭代器start和end指示的範圍為list賦值

void assign( size_type num, const TYPE &val ); //賦值num個以val為值的元素。 2.back() 返回最後一個元素的

2. erase() 刪除一個元素 

iterator erase( iterator loc );//刪除loc處的元素

iterator erase( iterator start, iterator end ); //刪除start和end之間的元素 

3.insert() 插入一個元素到list中 

iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入值為val的元素,返回指向這個元素的迭代器

void insert( iterator loc, size_type num, const TYPE &val );  //定位置loc前插入num個值為val的元素

void insert( iterator loc, input_iterator start, input_iterator end ); //在指定位置loc前插入區間[start, end)的所有元素

4.splice()  合併兩個list 

void splice( iterator pos, list &lst );//把lst連線到pos的位置

void splice( iterator pos, list &lst, iterator del );//插入lst中del所指元素到現連結串列的pos上

void splice( iterator pos, list &lst, iterator start, iterator end );//用start和end指定範圍。

3.C++ Deque(雙向佇列)

1)特點

1.隨機訪問方便,支援[]操作符和vector.at(),效能沒有vector好

2.可以在兩端進行插入和刪除操作,但效能不及list

3.可以在兩端進行push、pop

4.相對於vector佔用更多的記憶體。雙向佇列和向量很相似,但是它允許在容器頭部快速插入和刪除(就像在尾部一 樣)。 

2)語法

1.1.Constructors 建立一個新雙向佇列

deque();//建立一個空雙向佇列

deque( size_type size );// 建立一個大小為size的雙向佇列

deque( size_type num, const TYPE &val ); //放置num個val的拷貝到佇列中

deque( const deque &from );// 從from建立一個內容一樣的雙向佇列

deque( input_iterator start, input_iterator end ); // start 和 end - 建立一個佇列,儲存從start到end的元素。 

4.三者比較

1.vector 是一段連續的記憶體塊,而deque 是多個連續的記憶體塊, list 是所有 資料元素分開儲存,可以是任何兩個元素沒有連續。  據元素分開儲存,可以是任何兩個元素沒有連續。  

2.vector 的查詢效能最好,並且在末端增加資料也很好,除非它重新申請記憶體 段;適合高效地隨機儲存。  

3.list 是一個連結串列,任何一個元素都可以是不連續的,但它都有兩個指向上一 元素和下一元素的指標。所以它對插入、刪除元素效能是最好的,而查詢效能非 常差;適合大量地插入和刪除操作而不關心隨機存取的需求。  

4.deque 是介於兩者之間,它兼顧了陣列和連結串列的優點,它是分塊的連結串列和多 個數組的聯合。所以它有被list好的查詢效能,有被vector好的插入、刪除效能。 如果你需要隨即存取又關心兩端資料的插入和刪除,那麼deque是最佳之選。 

三.關聯容器

1.特點

1.內部實現是採用非線性的二叉樹結構,即紅黑樹的結構原理

2.元素是有序的集合,預設在插入的時候按升序排列

2.Sets  &MultiSets

1)特點

1集合(Set)是包含已排序物件的關聯容器

2多元集合(MultiSets)支援重複物件

2)語法

1.count()  返回某個值元素的個數

2.equal_range()   返回第一個>=關鍵字的迭代器和>關鍵字的迭代器

pair<iterator,iterator>equal_range(const key_type &key ); //key是用於排序的關鍵字

Set<int> ctr;

例如:

Pair<set<int>::iterator,set<int>::iterarot>p;

For(i=0;i<=5;i++) ctr.insert(i);

P=ctr.equal_range(2);

那麼*p.first==2;*p.second==3;  

3.find() 返回一個指向被查詢到元素的迭代器

iterator find( const key_type &key );

//查詢等於key值的元素,並返回指向該元素的迭代器;

//如果沒有找到,返回指向集合最後一個元素的迭代器 

3.Maps & MultiMaps

1.特點

1.Maps  關聯式容器,包含“關鍵字/值”對

2.MultiMaps 允許重複的元素

2.語法

1.count() 返回指定元素出現的次數

size_type count( const KEY_TYPE &key ); //返回map中鍵值等於key的元素的個數

2.equal_range() 返回特殊條目的迭代器對

pair equal_range( const KEY_TYPE &key );

//返回兩個迭代器,指向第一個鍵值為key的元素和指向最後一個鍵值為key的元素 

四.容器介面卡

1.特點

1.STL介面卡是容器的介面,它本身不能直接儲存元素,它儲存元素的機制是呼叫另一種順序容器去實現,即“它儲存一個容器,這個容器再儲存所有元素”。

2.預設stack和queue基於deque容器實現;priority_queue基於vector容器實現;建立介面卡時在第二個引數上指定具體的順序容器可以覆蓋介面卡的預設實現。

3.stack特點是後進先出,它關聯的基本容器可以是任何一種順序容器

4.queue的特點是先進先去,介面卡要求其關聯的基礎容器提供pop_front操作,因此其不能建立在vector容器上。

2.Stacks(堆疊)

1.pop() 移除棧頂元素

2.push() 在棧頂增加元素

3.size() 返回棧中元素數

3.Queues(佇列)

1..back() 返回一個引用,指向最後一個元素 

2.pop() 刪除第一個元素

3.push() 在末尾加入一個元素

4.Priority Queues(優先佇列)

1.特點

類似佇列,但是元素按照一定的斷言排列有序

2.語法

1.top() 返回優先佇列中有最高優先順序的元素 

五.迭代器

1.解釋

   迭代器是一種物件,用來遍歷STL容器中的部分或全部元素,每個迭代器物件代表容器中確定的地址。迭代器修改了常規指標的介面。迭代器是一種概念上的抽象:那些行為上像迭代器的東西都可以叫做迭代器,迭代器可以把抽象容易和通用演算法有機地結合起來。

     迭代器用於遍歷複雜資料結構,其下層執行機制取決於其所遍歷的資料結構,因此,每一種容器型別都必須提供自己的迭代器,事實上每一種零七都將其迭代器以巢狀的形式定義於內部。各種迭代器介面相同,型別卻不同。即泛型程式設計的概念:所有操作行為都使用相同的介面,雖然他們的型別不同。

2.功能特點

迭代器使開發人員不必整個實現類介面。只需提供一個迭代器,即可遍歷類中的資料結構,可被用來訪問一個容器類的所包含的全部元素。

//對vector容器物件生成和使用迭代器
vector<int>the_vector;
vector<int>::iterator the_iterator;
for(int i=0;i<10;i++)
    the_vector:push_back(i);
int total=0;
the_iterator=the_vector.begin();
while(the_iterator!=the_vector.end())
{
    total += *the_vector;
    the_iterator++;
}

cout<<"Total="<<total<<endl;
//提示:對一個迭代器的解引用操作(*),可以訪問到容器所包含的元素

注:本文語法中只包含有易錯及難點,常見簡單的語法並未包含在內,不代表沒有。