第十六章 string類和標準模板庫(3)標準模板庫

(三)標準模板庫

標準模板庫STL,standard template library,STL是1994年發佈,ISO/ANSI c++委員會投票將其作爲c++標準的一部分。STL不是面向對象的編程,而是一種不同的編程模式,泛型編程generic programming。STL提供了一組表示容器,迭代器,函數對象和算法模板

1.模板類vector

屬於容器類。

在頭文件vector(以前爲vector.h)中定義了vector模板。要使用模板類創建具體的對象,需要用<type>表示法指出要使用的類型,由於vector模板使用動態內存分配,因此可以使用初始化列表參數來指出需要多少矢量。比如:int n; cin>>n;vector<double> scores(n);。表示創建了含有n個元素的double類型的vector對象。可以使用重載的運算符[]來訪問各個元素。

vector模板的構造函數有多個,最常用的是vector<int> a(2);這種類型,另外還有vector<int> a(2,10);這種類型,表示元素個數是2,元素內容都是10;還可以使用列表初始化的方法比如vector<int> a{2,55};或者vector<int> a={2,55};,這也是標準模板使用更方便的原因。

容器類是可以存儲各種類型對象的並且有着特定功能的數組樣的類,使用類模板可以指定存儲對象的類型,這種編程思想叫泛型編程。

2.可對矢量執行的操作

vector是一個容器類,而STL的所有的容器類都有一些特定的方法,如size()返回容器中的元素的數目,swap()交換兩個容器的內容(相同的的元素類型纔可以被交換,swap函數的兩個參數是兩個容器名),begin()返回一個指向容器中第一個元素的迭代器end()返回一個表示超過容器尾的迭代器(超尾迭代器)。

迭代器:是一個廣義指針,是一個可以對其進行類似指針操作的對象,指針操作有解除引用和遞增pd++等操作。迭代器,使STL可以對不同的容器類提供統一的接口,比如vector<double>::iterator pd//pd an iterator;pd=scores.begin();使用自動類型推斷可以編制出更簡單的代碼:auto pd=scores.begin();迭代器可以方便容器類對象的使用,比如上面pd=scores.begin();那麼可以有:*pd=3.22;++pd;*pd=2.55;這樣可以快速而方便地遍歷容器。

所有的容器類都包含上面所說的方法(比如begin(),end()等),另外有一些只有某些容器類纔有的方法,push_back(相匹配的元素);這個函數方法可以將元素添加到容器類的末尾。比如:double temp;cin>>temp;scores.push_back(temp);。

erase()方法是用於刪除給定區間的元素,方法:scores.erase(scores.begin(),scores.begin()+3);第一個迭代器指向區間的起始處,第二個迭代器指向區間的結尾處的後一個位置。也就是[it1,it2)的範圍,包含第一個迭代器指向的對象但不包含第二個迭代器指向的位置。

insert()的方法,有三個參數,第一個參數定義了插入的位置(指定位置的前面),第二三個參數標記了插入的區間。比如依然是scores容器,那麼使用score.insert(scores.begin(),oldnumber.begin()+1,oldnumber.end());這是將oldnumber容器的除了第一位置的數據之外所有的數據插入到scores對象的最前面。insert()函數是插入到指定元素的前面。

3.對矢量可執行的其他操作

通常需要對數組進行許多操作,如搜索,排序等,STL不是爲每一個類定義了成員函數進行操作,而是定義了一個適用於所有容器類的非成員函數(比如find())。

3個具有代表性的STL函數:for_each()函數;這個函數不能對容器的內容進行更改,有三個參數,前兩個定義了容器類對象的區間,後一個是指向函數的指針(也就是函數名),表示對區間中的所有的元素執行函數操作(這個函數是對任意一種容器適用的)。random_shuffle()函數接受兩個指定區間的迭代器參數,並隨機排列該區間的元素。sort()函數(需要容器類允許隨機訪問),有兩個版本,第一個是有兩個指定區間的迭代器參數,然後sort()函數的作用是使用重載的<運算符對區間進行排序(如果是自定義的類,需要重新定義<運算符);第二個版本是接三個參數,前兩個也是區間,第三個是相應的排序函數(或者說是兩個類對象的比較函數)。

4.基於範圍的for循環

基於範圍的for循環是爲STL而設計的,如for(double x:prices){}。括號內的代碼聲明一個與容器存儲類型相同的變量,然後指出容器的名稱,接下來,程序根據循環體給出的變量,依次訪問容器中的每一個元素。就是變形了的for循環。比如:for(auto x,books) ShowReview(x);不同於for_each()基於範圍的for循環可以修改容器的內容,方法是將變量設定爲特定對象的引用類型。比如:for(auto & x:books) InflateReview(x);。

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