STL認識 6大元件

2021-07-04 07:47:40 字數 2912 閱讀 1580

stl(標準模板庫):乙個泛型程式庫

六大元件:

1 容器:各種資料結構,用於存放資料,管理某類物件的集合

1.1 序列式容器(sequence container):為可序(ordered群集),每個元素有固定位置,位置取決於插入時機和地點,和元素值無關;

1.1.1 vector:向量,動態陣列,可隨機訪問,即可以利用索引值直接訪問任何乙個元素,有下標訪問值操作;

1.1.2 deque:雙端佇列,動態陣列,可隨機訪問,即可以利用索引值直接訪問任何乙個元素,有下標訪問值操作;

1.1.3 list:實際為雙向鍊錶,解決上面兩種序列式容器在任意位置上插入或刪除操作的耗時問題,但list不提供隨機訪問,因此也沒有operator[ ]的下標訪問操作;

除此之外,也可以把string以及array(陣列)也當做序列式容器;

1.2 關聯式容器(associative container):為已序(sorted)群集,元素文職取決於特定的排序準則,元素位置取決於元素值,和插入次序無關,可當做特殊的序列式容器;

1.2.1 set:每個元素只能出現一次,不允許重複

1.2.2 multiset:與set相同,只是multiset允許重複元素的存在,即multiset可包含多個數值相同的元素;

1.2.3 map:map元素都是(key/value)對,每個元素都有乙個鍵,排序是按照鍵進行排序,不是按照元素值排序,map的每乙個鍵只允許出現一次,不允許重複,map可視為關聯式陣列,也就是具有任意索引型別的陣列;[配合pair結構體使用],注意map允許使用operator[ ]訪問元素;

1.2.4 multimap:與map相同,但multimap允許鍵值重複,即multimap可包含多個鍵值相同的元素;multiset可被當做「字典」;【配合pair結構體使用】,注意:multimap不允許使用operator[ ]操作符,因為multimap允許單一索引對應到多個元素,而下標操作符卻只能處理單一實值;

排序準則以函式形式呈現,用來比較元素值(value)或元素鍵值(key),預設情況下以operator《進行比較排序;該類容器通常由二叉樹為底層原理實現;

1.3 容器配接器(container adapter):根據基本容器的實作提供的用於滿足特殊場景或需求的容器;

1.3.1 stack:棧,採用lifo管理策略

1.3.2 queue:採用fifo管理策略,是個普通的緩衝區(buffer)

1.3.3 priority_queue:該容器中的元素可以擁有不同的優先權,優先權是基於排序準則的,預設使用operator

也可當做特殊的序列式容器

2 演算法

stl演算法是一種function template;

3 迭代器

可遍歷stl容器內全部或部分元素的物件,乙個迭代器用來指出容器中的乙個特定位置,扮演容器與演算法之間的膠合劑,屬於「泛型指標」,過載了operator* , operator->, operator++,operator–等指標操作;原生指標也是一種迭代器;

基本操作

a: operator*

b: operator++:注意:建議使用++it這種前置式的遞增,因為後置式的遞增it++會需要乙個額外的臨時物件,所以一般情況下建議使用++it,而不是用it++;

c: operator== operator!=

d: operator=

e: begin():返回乙個迭代器,指向容器起始點,即第乙個元素(如果有的話)的位置;

begin()與end()形成的是乙個形如[ )的區間,如上圖;不必對空區間採取特殊處理,空區間的begin()就等於end();

f: end():返回乙個迭代器,指向容器結束點,結束點在最後乙個元素之後,即剛好超出容器的範圍的第乙個位置;

注意:任何一種容器都定義了兩種迭代器型別:

1: container::iterator:以「讀/寫」模式遍歷元素」

2: container::const_iterator:以「唯讀」模式遍歷元素;

stl容器中預定義好的迭代器分類

雙向迭代器:以遞增前進,以遞減後退,list, set, multiset, map, multimap這些容器所提供的迭代器屬於此類;

隨機訪問迭代器:具備雙向迭代器的所有屬性,還具有隨機訪問能力,可以對迭代器增加或減少乙個偏移量,處理迭代器之間的距離,或是使用《和》之類的比較關係運算子來比較兩個迭代器,vector,deque,string所提供的迭代器都屬於此類;

注意:建議為了撰寫盡可能與容器型別無關的泛型**,最好不要使用隨機訪問迭代器的特有操作如《等比較運算子;

迭代器被劃分為5種不同類屬,以上是stl中預定義好的迭代器分類;

4仿函式

實際是一種過載了operator()的類或模板類

5配接器

用來修飾容器,或仿函式,或迭代器介面的東西,即容器分類上面的容器配接器

6配置器

負責空間配置與管理,實現了動態空間配置,空間管理,空間釋放的class template

注意:stl的設計原則是效率優先,安全次之,錯誤檢查幾乎沒有,對於stl的任何運用,如果違反規則,將會導致未定義行為,因此使用stl,必須滿足以下要求:

1 迭代器務必合法有效;

2 對逾尾的迭代器不進行operator*或operator->;

3 區間必須合法:包括:

3.1 指示兩個區間的迭代器必須是指向統一容器;

3.2 從第乙個迭代器出發,必須可以到達第二個迭代器;

3.3 如過乙個函式中涉及的區間不止乙個,第二區間及後繼區間必須擁有「至少和第一區間一樣多」的元素;

3.4 覆蓋動作中的目標區間,必須擁有足夠元素,否則就必須採用insert iterators(插入型迭代器);

STL六大元件

stl提供六大元件,彼此可以組合套用。1 容器 containers 各種資料結構。如vector,list,deque,set,map,用來存放資料。容器又可以分為順序容器和關聯容器.順序容器 vector,list,deque,stack,queue,heap,priority queue,sl...

STL 六大元件

1.容器 containers 各種資料結構,如vector,list,deque,set,map,用來存放資料。從實現的角度看,stl容器是一種class template。2.演算法 algorithms 各種常用的演算法如sort,search,copy,erase 從實現的角度看,stl演算...

STL六大元件

容器 containers 各種資料結構,如 vector list deque set map 用來存放資料。演算法 algorithms 各種常用演算法,如 sort search copy erase 分配器 allocators 負責空間配置與管理。迭代器 iterators 容器與演算法之...