STL學習筆記

STL( Standard Template Library)標準模板庫

一、STL有兩個特點:

1、它使算法和數據結構分離。

2、它使用了C++裏面的模板。

這兩特點都有一個目的就是使得它的通用性更強。如STL裏的sort函數,它可以用來操作數組、鏈表等數據結構。

二、STL有三個基本組件:

1、迭代器:提供訪問容器對象的方法

2、容器:是一種數據結構,如list、vector等。

3、算法:用來操作容器中的數據的模板函數。

三、頭文件

爲避免和其它頭文件起衝突,STL不再使用.h的頭文件。

例如下面的這個爲了使用string類、迭代器、算法的例子:

#include <string>

#include <iterator>

#include <algorithm>

以下是一些頭文件中包含的容器:

<deque>  deque

<list> list

<queue>  queue priority_queue

<map> map multimap

<set> set multiset

<stack> stack

<vector> vector vector<bool>

 

四、迭代器詳解

STL提供了五種迭代器:

1、Input iterators提供對數據的只讀訪問。

2、Output iterators提供對數據的只寫訪問。

3、Forward iterators提供讀寫訪問,並能向前推進的迭代器。

4、Bidirectional iterators提供讀寫訪問,並能向前和向後操作。

5、Random access iterators提供讀寫訪問,並能在數據中隨機移動。

這裏要說明的是指針也是一種迭代器,爲了說明這個這裏舉了一個例子,也就是使用指針作爲迭代器用於STL中的find()算法來搜索普通數組。

#include <iostream.h>

#include <algorithm>

using namespace std;

#define SIZE 100

int iarry[SIZE];

int main()

{

    arry[20]=50;

    int* p=find(iarry,iarry+SIZE,50);

    if(ip==iarry+SIZE)

         cout<<"沒找到50"<<endl;

    else

         cout<<"找到50"<<endl;

    return 0;
}

作爲對比這裏要使用一個容器迭代器的搜索例子,和指針不同的是可以使用容器類來提取迭代器對象。兩個典型的迭代器方法begin()和end(),它們在大多數容器中表示了容器的範圍。

下面這個是使用了vector來代替數組:

#include <iostream.h>

#include <algorithm>

#include <vector>

using namespace std;

vector<int> intVector(100);

int main()

{

     intVector[20]=50;

     vector<int>::iterator intlter=find(intVector.begin(),intVector.end(),50);

     if(intlter!=intVector.end())

         cout<<"vector容器包含"<<*intlter<<endl;

     else

         cout<<"vector容器不包含50"<<endl;

     return 0;

}

五、容器(vector封裝數組,list封裝了鏈表,map和set封裝了二叉樹等)
vector(向量)——STL中標準而安全的數組。 相當與數組,從後面快速的插入與刪除,直接訪問任何元素
deque(雙端隊列double-ended queue)——在功能上和vector相似,但是可以在前後兩端向其中添加數據。
list(列表)——遊標一次只可以移動一步。如果你對鏈表已經很熟悉,那麼STL中的list則是一個雙向鏈表(每個節點有指向前驅和指向後繼的兩個指針)。
聯合容器
(set multiset map multimap被稱爲關聯容器,他們都把一個鍵值於一個元素對應起來,並用該鍵來查找,插入,刪除等操作,他們對插入刪除操作取得了比線型時間更好的對數時間效果,當元素增多時他們內部使用的是二分查找,效率更加高效;但如果我們不需要這種額外的效率,就可以避免那些導致好時間帶來的可觀的複雜度與額外的指針空間;)
set(集合)——容器中的元素會自動按大小排序。元素的鍵和值合二爲一,這些數據的值(value)必須是唯一的。
multiset(多重集)——和集合(set)相似,然而其中的值不要求必須是唯一的(即可以有重複)。
map(映射)——經過排序了的二元組的集合,map中的每個元素都是由兩個值組成,其中的key(鍵值,一個map中的鍵值必須是唯一的)是在排序 或搜索時使用,它的值可以在容器中重新獲取;而另一個值是該元素關聯的數值。比如,除了可以ar[43] = "overripe"這樣找到一個數據,map還可以通過ar["banana"] = "overripe"這樣的方法找到一個數據。如果你想獲得其中的元素信息,通過輸入元素的全名就可以輕鬆實現。
multimap(多重映射)——和映射(map)相似,然而其中的鍵值不要求必須是唯一的(即可以有重複)。
容器適配器
stack    後進先出
queue    先進先出
priority_queue 最高優先級元素總是第一個出列

六、算法

1、排序算法

STL中的排序算法有以下幾種:

sort 對給定區間所有元素進行排序
stable_sort 對給定區間所有元素進行穩定排序
partial_sort 對給定區間所有元素部分排序
partial_sort_copy 對給定區間複製並排序
nth_element 找出給定區間的某個位置對應的元素
is_sorted 判斷一個區間是否已經排好序
partition 使得符合某個條件的元素放在前面
stable_partition 相對穩定的使得符合某個條件的元素放在前面

STL中默認排序以從小到大來進行排序。如果你不想使用默認的來進行排序,

則你可以使用STL提供的以下一些仿函數

其它的有空會繼續寫

 

equal_to 相等
not_equal_to 不相等
less 小於
greater 大於
less_equal 小於等於
greater_equal 大於等於

vector <int> vect;
sort(vect.begin(), vect.end());
//此時相當於調用
sort(vect.begin(), vect.end(), less<int>());

你也可以自己定義一個仿函數,定義的格式如下

bool 函數名(const 參數類型 & 參數1,const 參數類型 & 參數2)

{

    return 布爾值;
}

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