ACM學習歷程4 STL的使用

2021-07-17 03:37:58 字數 3334 閱讀 8757

在演算法設計大賽中,會使用一些語言本身提供的庫,在這些庫裡面包含了大量已經實現了的資料結構或者演算法,我們是需要在使用的過程中加入響應的標頭檔案即可使用。標準模板庫(standard template library

)是ansi/iso c++

最有特色、最實用的部分之一。

stl包含了容器類(

container

)、迭代器(

iterator

)和演算法(

algorithm

)三個部分。泛型演算法(

generic algorithm

)和函式物件(

function object

)的概念與使用使演算法擺脫了對不同型別資料個性操作的依賴,這樣就可以編出更具通用性的演算法。

首先明確幾個概念:

容器:可容納各種資料型別的資料結構。

迭代器:可依次訪問容器中元素的東西。

演算法:用來操作容器中的元素的函式模板。例如,stl

用sort()

來對乙個

vector

中的資料進行排序,用

find()

來搜尋乙個

list

中的物件。

在容器裡面主要有如下三大類:

1) 順序容器

vector:後部插入

/刪除,直接訪問,實際上就是個動態陣列。隨機訪問任何元素都能在常數時間完成,在尾端增刪元素具有較佳的效能。使用時需包含標頭檔案標頭檔案

。deque:前

/後部插入

/刪除,直接訪問,相當於動態陣列,隨機訪問任何元素都能在常數時間完成

(但效能次於

vector)

,在兩端增刪元素具有較佳的效能,在使用時需包含

標頭檔案。

list:雙向鍊錶,任意位置插入

/刪除,在任何位置增刪元素都能在常數時間完成。不支援隨機訪問,使用時需包含

標頭檔案。

2)關聯容器

set:快速查詢,無重複元素,使用時包含

標頭檔案。

multiset:快速查詢,可有重複元素,使用時包含

標頭檔案。

map:一對一對映,無重複元素,基於關鍵字查詢,使用時包含

標頭檔案。

multimap:一對一對映,可有重複元素,基於關鍵字查詢,使用時包含

標頭檔案。

上述四種容器通常以平和二叉樹方式實現,插入和檢索的時間效力為o(logn)。

3)容器介面卡

stack:

lifo

(後進先出),是項的有限序列,並滿足序列中被刪除、檢索和修改的項只能是最近插入序列的項,使用時需包含標頭檔案

。queue:

fifo

(先進先出),插入只可以在尾部進行,刪除、檢索和修改只允許從頭部進行,使用時需包含標頭檔案

。priority_queue:優先順序高的元素先出,使用時需包含標頭檔案

標頭檔案。

容器的共有成員函式:

(一)所有標準庫容器共有的成員函式:

(1)相當於按詞典順序比較兩個容器大小的運算子:

=, < , <= , >  , >=, == , !=;

(2)empty :

判斷容器中是否有元素; (3

)max_size:

容器中最多能裝多少元素; (4

)size:

容器中元素個數; (5

)swap:

交換兩個容器的內容。

(二)只在第一類容器中使用的函式(第一類容器:順序容器和關聯容器)(1)

begin

:返回指向容器中第乙個元素的迭代器; (2

)end:

返回指向容器中最後乙個元素後面的位置的迭代器; (3

)rbegin:

返回指向容器中最後乙個元素的迭代器; (4

)rend:

返回指向容器中第乙個元素前面的位置的迭代器; (5

)erase:

從容器中刪除乙個或幾個元素; (6

)clear:

從容器中刪除所有元素。

(三)迭代器:於指向第一類容器中的元素,有const

和非 const

兩種。

(1)通過迭代器可以讀取它指向的元素,通過非

const

迭代器還能修改其指向的元素,迭代器用法和指標類似。 (2

)定義乙個容器類的迭代器的方法可以是:

容器類名::iterator   

變數名; 或:

容器類名::const_iterator

變數名; (3

)訪問乙個迭代器指向的元素:

* 迭代器變數名 (4

)迭代器上可以執行

++ 操作,以指向容器中的下乙個元素。如果迭代器到達了容器中的最後乙個元素的後面,則迭代器變成

past-the-end值。

(5)使用乙個

past-the-end

值的迭代器來訪問物件是非法的,就好像在

c中使用

null

或未初始化的指標一樣。

(四)容器所支援的迭代器類別:

stl除了容器和迭代器之外,還提供一些已經實現了的演算法,這些演算法只需要包含正確的標頭檔案即可使用。

stl中包含了大量的標準演算法,例如插入、刪除、查詢、排序等等。但是在使用這些演算法時,需要注意函式的引數。演算法通過迭代器可以操作容器的元素,一般這些演算法都需要兩個引數,乙個是起始元素的迭代器,乙個是終止元素的後面乙個迭代器,例如在使用排序和查詢演算法時都需要提供以上兩個迭代器。有一些演算法會返回乙個迭代器,例如在容器中使用

find

函式時,若找到該元素將會返回乙個指向鈣元素的迭代器。在

stl中,這些演算法出了可以處理容器的一般操作外,也可以應用於

c語言的陣列,例如可以使用

sort

函式對陣列中的元素進行排序。

stl中提供的演算法包含在標頭檔案的定義中,使用這些演算法需要先進行頭檔案的引用。

(一)在

中定義

(1)排序演算法 (2

)變化序列演算法

copy ,remove,fill,replace,random_shuffle,swap, … (3

)非變化序列演算法:

adjacent-find, equal, mismatch,find ,count, search, count_if, for_each, search_n

(二)在

中的定義 (1

)數值演算法:

iota

,accumulate

,inner_product

TypeScript的學習歷程4

typescript 介面 function printlabel labelledobj console.log labelledobj.label let myobj 介面 printlabel myobj 使用介面 使用另一種方法編寫 介面inte ce lablesss function p...

STL在ACM競賽中的使用

string類具有的優點 可以直接用四則運算符和關係運算子,簡化了字串型別的操作。cpp view plain copy print?string string1 22 string2 11 string1 string2 類似於strcat intlength string1.length 類似於...

webpack4 x的使用歷程

第一次接觸的webpack是在乙個3.x的資料中 在4.x的運用中遇到了好多的坑,我就以小白的身份把我使用webpaxk的過程分享出來,其中很多不足歡迎大佬們指正 node安裝不再贅述 一 安裝 npm i webpack d 在專案中安裝 webpack 4.16.5 npm install we...