標准模板庫(STL,Standard Template Library)是C++標准庫的重要組成部分,包含了諸多在計算機科學領域裡所常見的基本數據結構和基本算法,為廣大C++程序員提供了一個可擴展的應用框架,高度體現了軟件的可復用性。
1.STL簡介
STL最初由惠普實驗室開發,並於1998年被定義為國際標准,正式成為C++語言的標准庫。在STL中采用了泛型編程的方法,泛型編程是通過模板來實現算法源代碼,並將其用於不同數據類型的軟件重用方法。從根本上說,STL是一些容器、算法和其他一些組件的集合,這些容器有list,vector,set,map等。STL已經是標准化組件,在使用時不需要重新開發,直接使用現有的組件。因此,使用STL編寫程序會更加容易和高效。
在C++標准中,STL被組織成下面的13個頭文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。通常STL中最重要的是算法和容器,而迭代器將二者統一起來,每個容器都有自己的迭代器,算法通過迭代器來定位和操縱容器中的元素。
C++標准庫提供了眾多的類和函數,可以完成更多的功能,當我們編寫程序時,我們定義的類名和函數名可能和標准庫中的某個名稱相同。為了避免這種情況所造成的名稱沖突,C++標准庫中的一切類和函數都放在命名空間std中。
a、新的C++頭文件如<iostream>包含的基本功能和對應的舊文件(<iostream.h>)相同,但頭文件的內容包含在std命名空間中;
b、具有C庫功能的新C++頭文件具有如<cstdio>這樣的名字,它們提供的內容和相應的C頭文件相同,只是內容在std中。
標准STL序列容器:vector、string、deque和list。
標准STL關聯容器:set、multiset、map和multimap。
更多的STL知識,可見《EFFECTIVE STL中文版:50條有效使用STL的經驗 》,這裡簡單介紹string、vector、list和map四種。
2.string類型
與其他標准庫類型一樣,如果用戶要使用string類型,必須包含相關頭文件:
#include<> std::;
a、string對象的初始化
>> s3( s4(s3,); s5(s3.begin(),s3.begin()+); s6(s3,,); s7(,);b、string對象的輸入輸出
string對象的輸入輸出與基本類型的輸入輸出類似,可直接使用cout、cin以及<<、>>運算符。
c、string類的基本操作
s1=s2; s1.empty(); s1.size(); s1[n]; s+=s2;s1=s1+s2; s1.insert(pos,s2); s1.insert(pos,cp,len); s1.c_str(); s1.substr(pos,n); s1.append(s2); s1.append(cp); s1.replace(pos,len,s2); s1.find(s2,pos); s1.rfind(s2,pos); s1.find_first_of(s2,pos); s1.find_last_of(s2,pos);
3.vector類型
注意:vector是一個類模板,而非數據類型
a、vector對象的初始化
vector<><> ivec1(ivec); vector<> ivec2(n,i); vector<> ivec3(n);
b、vector類常用的接口
reserve(size_type n); size_type capacity() ; iterator begin(); iterator end(); reverse_iterator rbegin(); reverse_iterator rend(); resize(size_type n, T x=T()); size_type size(); empty() ; reference at(size_type pos); reference [](size_type pos); reference front() reference back(); push_back( T &x); pop_back(); assign(const_iterator front, const_iterator last); assign(size_type n, T&x=T()); T& x=T()); insert(iterator it, size_type n, T& x); insert(iterator it, const_iterator front, const_iterator last); iterator erase(iterator front, iterator last); clear(); swap(vector x);
c、迭代器
定義迭代器vector<T>::iterator it;迭代器類似於指針,可以使用*it來訪問相應元素,容器的begin()和end()函數都是常用接口,在程序設計時注意靈活使用。
為了減少向量每次都需要申請和釋放空間操作,vector容器每次在申請內存時,都會額外申請一塊連續的存儲區,用於存放新加入的元素,從而不必每次都為新元素重新分配一次容器。vector容器的存儲狀態如圖:
b、數據的插入有三種方法
用insert函數插入pair數據,pair是<utility>頭文件中定義的struct,在STL中凡是“必須傳回兩個值”的函數,都會用到pair
mapStudent.insert(pair<, *>(,));
用insert插入value_type數據
mapStudent.insert(map<, *>::value_type(,));
使用數組方式插入數據
mapStudent[] = ;
如何判斷插入成功與否問題
<, *><map<, *>::iterator, >= mapStudent.insert(pair<, *>(, (Insert_Pair.second == <<<<<<<<
c、map的大小:mapStudent.size();
遍歷:
(map<, *>::iterator iter = mapStudent.begin();iter!=mapStudent.end();iter++<<iter->first<< <<iter->second<<endl;}
數據的查找:count計數關鍵字出現的次數,返回只能是0(沒出現)或1(出現);使用find
map<, *>::iterator iter = mapStudent.find((iter !=<<<<<<<<endl;}
數據的清空與判空:clear()和empty()
d、數據的刪除,erase有三個重載函數
map<, *>= mapStudent.find( n = mapStudent.erase(); mapStudent.erase(mapStudent.begin(), mapStudent.end());
5.list鏈表
list將元素按順序儲存在鏈表中。 與vector相比,它允許快速的插入和刪除,但是隨機訪問卻比較慢。list對象函數
assign() ; begin() ; end() ; clear(); empty() ; erase() ; front() ; back() ; get_allocator() ; insert() ; max_size() ; merge() ; splice() ; pop_back(); pop_front() ; push_back() ; push_front() ; rbegin() ; rend() ; remove() ; remove_if() ; resize() ; reverse() ; size() ; sort(); swap(); unique();STL的各個容器之間的操作有很多近似之處,先介紹到這裡。