在前面的幾篇中,已經將C++的特性基本都提到了,今天主要說說C++ STL編程,何爲STL(Standard Template Library),即標準模板庫,是一個具有工業強度的,高效的C++程序庫。它被容納於C++標準程序庫(C++ Standard Library)中,是ANSI/ISO C++標準中最新的也是極具革命性的一部分。該庫包含了諸多在計算機科學領域裏所常用的基本數據結構和基本算法。爲廣大C++程序員們提供了一個可擴展的應用框架,高度體現了軟件的可複用性。下面我們就具體說說什麼是STL吧。
STL概述:組件、容器、迭代器、算法。
STL是C++標準程序庫的核心;
STL是泛型程序庫;
STL由一些可適應不同需求的集合類,以及在這些數據集合上操作的算法構成;
STL內的所有組件都是由模板構成,其元素可以是任意類型;
STL是所有C++編譯器和所有操作系統平臺都支持的一種庫。
模板:在前面的文章中說過如何定義一個模板函數,現在我們先試着針對一個或多個尚未明確的類型定義類和函數。
<span style="font-family:Times New Roman;font-size:14px;">#include <iostream> using namespace std; template <typename T> class TempClass { private: T value; public: TempClass(T t) { value=t; } T GetValue() { return value; } void SetValue(T t) { value=t; } }; int main() { TempClass<char> ch('A'); cout<<ch.GetValue()<<endl; ch.SetValue('B'); cout<<ch.GetValue()<<endl; TempClass<double> d(5.5); cout<<d.GetValue()<<endl; d.SetValue(6.6); cout<<d.GetValue()<<endl; return 0; } </span>
STL組件:容器(管理某類對象的集合)、迭代器(在對象集合上進行遍歷)、算法(處理集合內的元素)STL容器的共通能力:所有的容器存放的都是值而非引用;所有元素都形成一個次序,可以按相同的次序一次或多次遍歷元素。
STL容器元素的條件:必須能夠通過拷貝構造函數進行賦值;必須可以通過賦值運算完成複製操作;必須可以通過析構函數完成銷燬動作......
STL容器的共同操作:
初始化:1.產生一個空的容器;2.以另一個容器元素爲初值完成初始化;3.以數組元素爲初值完成初始化
與大小相關的操作:1.size();2.empty()3.max_size()
比較:==、!=、<、<=、>、>= 比較操作兩端的容器必須屬於同一類型;如果兩個容器內所有的元素按序相等,那麼這兩個容器相等;採用字典式順序判斷兩個容器大小
賦值(assignment)和交換(swap):swap提高賦值的操作效率
與迭代器相關的操作:
begin()返回一個迭代器,指向第一個元素;
end()返回一個迭代器,指向最後一個元素;
rbegin()返回一個逆向迭代器,指向逆向遍歷的第一個元素;
rend()返回一個逆向迭代器,指向逆向遍歷的最後一個元素;
元素操作:
insert(pos,e)將元素e拷貝安插於迭代器pos所指的位置;
erase(beg,end)移除[beg,end]區間內所有的元素;
clear()移除所有元素;
迭代器(iterator):
可以遍歷STL容器內全部或部分元素的對象;指出容器中的一個特定位置;迭代器的基本操作;
*:返回當前位置上的元素值。如果該元素上有成員,可以通過迭代器以operator->取用
++:將迭代器前進至下一個元素
==和!=:判斷兩個迭代器是否指向同一位置
=:爲迭代器賦值
iterator迭代器和const_iterator迭代器,顧名思義
STL容器:
常見容器:vector、deque、list、map/multimap、set
特殊容器:stack、queue、priority_queue
其他容器:hashtable
vector容器:vector模擬動態數組。以下代碼列出了vector的常見操作
<pre name="code" class="cpp"><span style="font-size:14px;">#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { //創建一個空的vector容器 vector<int> v; //向容器末尾追加值 v.push_back(1); //定義一個迭代器 vector<int>::iterator i = v.begin(); //顯示第一個元素 cout<<"第一個元素爲:"<<v.front()<<endl; cout<<"第一個元素爲:"<<v[0]<<endl; cout<<"第一個元素爲:"<<*i<<endl; //在第二個位置插入一個元素 v.push_back(2); i=v.begin(); v.insert(++i,3); //迭代Vector cout<<"遍歷vector:"; for(i=v.begin();i!=v.end();i++) { cout<<*i<<","; } cout<<endl; //移除最後一個元素 v.pop_back(); cout<<"pop_back移除後vector的大小爲:"<<v.size()<<endl; //移除第一個元素 i=v.begin(); v.erase(i); cout<<"erase移除後vector的大小爲:"<<v.size()<<endl; //清空vector v.clear(); cout<<"清空後vector的大小爲:"<<v.size()<<endl; return 0; }</span>
deque容器:deque和vector一樣,採用線性表,與vector唯一不同的是,deque採用的分塊的線性存儲結構,每塊大小一般爲512字節,稱爲一個deque塊,所有的deque塊使用一個Map塊進行管理,每個map數據項記錄各個deque塊的首地址,這樣以來,deque塊在頭部和尾部都可已插入和刪除元素,而不需要移動其它元素。
list容器:使用雙向鏈表管理元素;不支持隨機存取,因此不提供下標操作符;在任何位置上執行元素的安插和移除都非常快;安插和刪除不會導致指向其他元素的指針、引用、iterator失效。
#include <iostream> #include <list> #include <iterator> using namespace std; int main() { //創建一個空的list容器 list<int> l; //向容器末尾追加值 l.push_back(1); //定義一個迭代器 list<int>::iterator i = l.begin(); //顯示第一個元素 cout<<"第一個元素爲:"<<l.front()<<endl; cout<<"第一個元素爲:"<<*i<<endl; //在第二個位置插入一個元素 l.push_back(2); l.insert(++i,3); //在首位插入元素 l.push_front(4); //迭代list cout<<"遍歷list:"; for(i=l.begin();i!=l.end();i++) { cout<<*i<<","; } cout<<endl; //移除最後一個元素 l.pop_back(); cout<<"pop_back移除後list的大小爲:"<<l.size()<<endl; //刪除第二個元素 i=l.begin(); l.erase(++i); cout<<"erase移除後list的大小爲:"<<l.size()<<endl; //移除第一個元素 l.pop_front(); cout<<"pop_front移除後list的大小爲:"<<l.size()<<endl; //清空list l.clear(); cout<<"清空後list的大小爲:"<<l.size()<<endl; return 0; }
map/multimap:使用平衡二叉樹管理;key-value存儲;根據key自動排序;不能直接改變key,可以通過operator[]直接存取元素值;map中key唯一,multimap中key值不唯一。
#include <iostream> #include <map> #include <iterator> #include <string> using namespace std; int main() { map<int,string> m; //向map中插入元素 m.insert(pair<int,string>(1, "qqq")); m.insert(map<int,string>::value_type(2,"www")); m[3]="eee"; map<int,string>::iterator i = m.begin(); //迭代map for(i=m.begin();i!=m.end();i++) { cout<<i->first<<":"<<i->second<<endl; } //元素個數 cout<<"map中元素個數爲:"<<m.size()<<endl; //根據key找元素 i=m.find(1); cout<<"1對應的值爲:"<<i->second<<endl; //根據迭代器指針移除 m.erase(i); cout<<"iterator移除後大小是:"<<m.size()<<endl; //根據key來移除 m.erase(2); cout<<"www移除後大小是:"<<m.size()<<endl; //清空map m.clear(); cout<<"clear移除後大小是:"<<m.size()<<endl; return 0; }
還有其他一些容器,此處不再一一說明。
STL算法:搜尋、排序、拷貝、數值運算
STL提供了一些標準算法來處理容器內的元素(搜尋、排序、拷貝、數值運算);STL的算法是全局函數;
本文主要介紹STL幾大容器以及迭代器的具體操作,關於更多STL的操作,請點擊這裏下載ppt教程。