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 布爾值;
}