STL知識總結

2021-08-20 07:23:24 字數 4912 閱讀 1376

(最近學了個c++標準模板庫,名字叫做stl,個人感覺比較實用,但也是不太好理解。其他滿分,真的型別全,範圍廣,最最重要的一點是極為方便。)

一    什麼是stl

(1)stl是c++標準程式庫的核心,深刻影響了標準程式庫的整體結構,它由一些可適應不同需求的集合類,以及在這些資料集合上操作的演算法構成,stl內的所有元件都由模板構成,其元素可以是任意型別。stl是所有c++編譯器和所有作業系統平台都支援的一種庫。這是不是就可以看出stl有多方便。

(2)stl主要有以下幾部分構成容器(container) (管理某類物件的集合),迭代器(iterator) (在物件集合上進行遍歷),演算法(algorithm) ( 處理集合內的元素),容器介面卡(container adaptor),函式物件(functor)

(3)stl容器主要分為兩種

序列式容器-排列次序取決於插入時機和位置

關聯式容器-排列順序取決於特定準則

(4)stl容器的共同能力

所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指標。

所有元素都形成乙個次序(order),可以按相同的次序一次或多次遍歷每個元素

(5)stl容器元素的條件

必須能夠通過拷貝建構函式進行複製,必須可以通過賦值運算子完成賦值操作,必須可以通過析構函式完稱銷毀動作,序列式容器元素的預設建構函式必須可用,某些動作必須定義operator ==,例如搜尋操作;關聯式容器必須定義出排序準則,預設情況是過載operator <

二    操作

共同操作

1.初始化,產生乙個空容器,以另乙個容器元素為初值完成初始化

std::listl; …

std::vectorc(l.begin(),l.end());

2.以陣列元素為初值完成初始化

int array=; …

std::setc(array,array+sizeof(array)/sizeof(array[0]));

(1)與大小有關的操作

size()-返回當前容器的元素數量;empty()-判斷容器是否為空;max_size()-返回容器能容納的最大元素數量

比較(comparison)==,!=,<,<=,>,>=比較操作兩端的容器必須屬於同一型別,如果兩個容器內的所有元素按序相等,那麼這兩個容器相等;採用字典式順序判斷某個容器是否小於另乙個容器

(2)賦值和交換

swap用於提高賦值操作效率,與迭代器(iterator)相關的操作,例子很多就列舉以下幾個

begin()-返回乙個迭代器,指向第乙個元素,

end()-返回乙個迭代器,指向最後乙個元素之後,

rbegin()-返回乙個逆向迭代器,指向逆向遍歷的第乙個元素。

rend()-返回乙個逆向迭代器,指向逆向遍歷的最後乙個元素之後

(3)元素操作

例如以下三個,就是關於元素操作

insert(pos,e)-將元素e的拷貝安插於迭代器pos所指的位置

erase(beg,end)-移除[beg,end]區間內的所有元素

clear()-移除所有元素

三    迭代器

迭代器是乙個經常聽到的名詞,而stl中的迭代器是什麼呢,本人只知道其可遍歷stl容器內全部或部分元素的物件

指出容器中的乙個特定位置。

(1)雙向迭代器

可以雙向行進,以遞增運算前進或以遞減運算後退、可以用==和!=比較。

list、set和map提供雙向迭代器

(2)隨機訪問迭代器

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

三    具體有啥

(一)vector

vector模擬動態陣列

vector的元素可以是任意型別t,但必須具備賦值和拷貝能力(具有public拷貝建構函式和過載的賦值操作符)

必須包含的標頭檔案#include ,vector支援隨機訪問其大小(size)和容量(capacity);size返回返回實際元素個數,capacity返回vector能容納的元素最大數量。如果插入元素時,元素個數超過capacity,需要重新配置內部儲存器。

1.移除(remove)元素

c.pop_ back)             移除最後乙個元素但不返回最後乙個元素

c.erase(pos)              刪除pos位置的元素,返回下乙個元素的位置

c.erase(beg,end)      刪除區間[beg,end]內所有元素,返回下乙個元素的位置

c.clear()                    移除所有元素,清空容器

c.resize(num)           將元素數量改為num (增加的元素用de****t建構函式產生,多餘的元素被刪除)

c.resize(num,e)        將元素數量改為num (增加的元素是e的副本)

vector 引用示例

(二)map/multimap

它使用平衡二叉樹管理元素,元素包含兩部分(key,value),key和value可以是任意型別;必須包含的標頭檔案#include 。根據元素的key自動對元素排序,因此根據元素的key進行定位很快,但根據元素的value定位很慢,且不能直接改變元素的key,可以通過operator 直接訪問元素值,map中不允許key相同的元素,multimap允許key相同的元素

(1)構造、拷貝和析構

map c                  產生空的map

map c1(c2)          產生同型別的c1,並複製c2的所有元素

map c(op)           以op為排序準則產生乙個空的map

map c(beg,end)  以區間[beg,end]內的元素產生乙個map

map c(beg,end,op)          以op為排序準則,以區間[beg,end]內的元素產生乙個map

~ map()              銷毀所有元素並釋放記憶體。

(2)非變動性操作

c.size()                返回元素個數

c.empty()            判斷容器是否為空

c.max size()        返回元素最大可能數量

c1==c2              判斷c1是否等於c2

c1!=c2               判斷c1是否不等於c2

c1c2                判斷c1是否大於c2

c1<=c2             判斷c1是否大於等於c2

c1>=c2             判斷c1是否小於等於c2

(3)特殊搜尋操作

count(key)        返回"鍵值等於key"的元素個數

find(key)           返回"鍵值等於key」的第乙個元素,找不到返回

lower. bound(key)                返回」鍵值大於等於key」的第乙個元素

upper_ bound(key)               返回」鍵值大於key'的第乙個元素

equal_ range(key)                 返回"鍵值等於key"的元素區間

(4)迭代器相關函式

begin()            返回乙個雙向迭代器,指向第乙個元素

end()               返回乙個雙向迭代器,指向最後-乙個元素之後

rbegin()          返回乙個逆向迭代器,指向逆向遍歷的第一- -個元素

rend()             返回乙個逆向迭代器,指向逆向遍歷的最後乙個元素

(5)安插(insert) 元素

c.insert(pos,e)          在pos位置為起點插入e的副本,並返回新元素位置(插入速度取決於pos)

c.insert(e)                插入e的副本,並返回新元素位置

c.insert(beg,end)     將區間[beg,end]內所有元素的副本插入到c中

(6)移除(remove) 元素

c.erase(pos)        刪除迭代器pos所指位置的元素,無返回值

c.erase(val)         移除所有值為val的元素,返回移除元素個數

c.erase(beg,end)         刪除區間[beg,end]內所有元素,無返回值

c.clear()                       移除所有元素,清空容器

二、**演示

#include #include #include using namespace std;

int main()

cout << "size: " << a.size() << endl;

a.pop_back();

a[0] = 1;

cout << "size: " << a.size() << endl;

for (int i = 0; i < (int)a.size(); ++i)

cout << endl;

sort(a.begin(), a.end());

cout << "size: " << a.size() << endl;

for (int i = 0; i < (int)a.size(); ++i)

cout << endl;

a.clear();

cout << "size: " << a.size() << endl;

return 0;

}

下面是見證奇蹟的時刻

好用且方便,值得擁有

三、心得體會

stl作為c++的工具,確實會給使用者帶來極大的方便,但方便的同時,有權衡好如何使用它,乙個不留神可能就會導致錯誤連篇,要熟練掌握,還是有一段路要走的。 

STL重要知識總結

stl的知識學完了,明天的演算法課就要講貪心演算法了。在這一段stl學習中,我逐漸掌握了stl模板的使用,的確很方便,也很讓人依賴。題目需要思考,知識需要理解。vj上的題目沒做幾道,多數是用sort,vector,set做的,很多不會的題目。我總結這個不會有兩個因素 閱讀英語材料不是很適應和解題和 ...

STL不熟知識點總結

在前面已經總結了stl基本知識點的應用,本篇部落格我將主要總結一下自己對stl這一方面不熟的知識點。一.用迭代器遍歷map中的元素 訪問標準容器的元素的通用方法是使用迭代器 for map iterator it b.begin it b.end it 2.it first 表示用迭代器指向map中...

STL相關知識

c 的標準模板庫 standard template library,簡稱stl 是乙個容器和演算法的類庫。容器往往包含同一型別的資料。stl中比較常用的容器是vector,set和map等。vectore 乙個vector類似於乙個動態的一維陣列,vector中可以存在重複的元素!1 宣告 1 v...