STL標準模板庫的一些知識點彙總 1

2021-07-13 15:12:19 字數 3535 閱讀 2120

stl的六個基本概念:容器(container)、迭代器(iterator)、演算法(algorithm)、函式物件(function object)、介面卡(adaptor) 和分配器(allocator).

c++標準庫提供四種序列容器和四種關聯容器,另外三種序列容器介面卡。

序列容器

序列容器裡的元素保持嚴格的線性排列,deque , list , vector 是常用的三種序列容器。

容器裡有大量的插入及刪除操作的情況下優先使用list;在容器頭尾有大量插入及刪除的情況下優先使用deque容器,其他情況使用vector。

第四種序列容器是basic_string,用於表示字串。

三個介面卡類模板:queue、priority_queue 和 stack 都是類介面卡(適配型別)。(另一種介面卡為  例項介面卡:適配型別的例項)。

任何序列容器型別,只要是copyconstructible(可複製構造語義,型別t的例項能從型別t的另乙個例項複製構造而來,則t是可複製構造的。)

關聯容器

關聯容器提供基於鍵的元素查詢能力。stl中:map, multimap, set和 multiset. map 和multimap 提供了一種鍵型別與另一種值型別的關聯。

標準庫的容器中,只有vector保證其元素的儲存空間是連續的,因而,它和c api相容, 即可以通過 &vector[0] 獲取其指向連續資料的指標(陣列指標)。

對於std::string (或 std::wstring) 在已知的標準庫字串實現中,無一不採用連續的儲存空間,即便如此,其仍不保證其儲存空間是連續的,不能使用上述用法。

s所有的標準容器都提供裡額swap()方法,可以在常數時間內,通過交換一些成員變數的值,交換同型別容器的內部狀態,且該方法保證不丟擲異常。(??)

迭代器可自增,解引用,可比較。某些迭代器可自減,有些支援指標算術運算。但並非所有指標操作可用於迭代器。

根據迭代器對指標操作的支援程度,迭代器概念提煉五個類別:輸入迭代器(input iterator)、輸出迭代器(output iterator)、前向迭代器(forward iterator)、雙向迭代器(ibidirectional iterator) 以及隨機訪問迭代器(random access  iterator). 迭代器類別有時也稱為「概念」(concept).

輸入迭代器:最基礎的一類非變動性迭代器,支援有限的指標操作。可以預設構造它,拷貝構造它,對它複製賦值,自增它或比較該迭代器型別的兩個例項。

輸入/輸出迭代器有乙個重要特性(single-pass)一遍演算法:使用輸入迭代器的演算法不允許兩次經過同乙個迭代器。解引用返回的是右值。

輸出迭代器是最基礎的一類變動性迭代器,解引用返回左值,能出現在賦值運算子的左邊。

前向(正向)迭代器結合輸入輸出,參與多次性(multipass)演算法。

雙向支援自減反向遍歷,隨機是雙向的超集,增加了算術運算,即可以對隨機訪問迭代器的例項進行下標運算,或者設定偏移量。

迭代器類別 說明

輸入從容器中讀取元素。輸入迭代器只能一次讀入乙個元素向前移動,輸入迭代器只支援一遍演算法,同乙個輸入迭代器不能兩遍遍歷乙個序列 輸出

向容器中寫入元素。輸出迭代器只能一次乙個元素向前移動。輸出迭代器只支援一遍演算法,統一輸出迭代器不能兩次遍歷乙個序列 正向

組合輸入迭代器和輸出迭代器的功能,並保留在容器中的位置 雙向

組合正向迭代器和逆向迭代器的功能,支援多遍演算法

隨機訪問

組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向後跳過任意個元素

迭代器操作 說明

所有迭代器

p++後置自增迭代器

++p前置自增迭代器

輸入迭代器 *p

復引用迭代器,作為右值

p=p1

將乙個迭代器賦給另乙個迭代器

p==p1

比較迭代器的相等性

p!=p1

比較迭代器的不等性

輸出迭代器 *p

復引用迭代器,作為左值

p=p1

將乙個迭代器賦給另乙個迭代器

正向迭代器

提供輸入輸出迭代器的所有功能

雙向迭代器

--p前置自減迭代器

p--後置自減迭代器

隨機迭代器

p+=i

將迭代器遞增i位

p-=i

將迭代器遞減i位

p+i在p位加i位後的迭代器

p-i在p位減i位後的迭代器

p[i]

返回p位元素偏離i位的元素引用

p如果迭代器p的位置在p1前,返回true,否則返回false

p<=p1

p的位置在p1的前面或同一位置時返回true,否則返回false

p>p1

如果迭代器p的位置在p1後,返回true,否則返回false

p>=p1

p的位置在p1的後面或同一位置時返回true,否則返回false

只有順序容器和關聯容器支援迭代器遍歷,各容器支援的迭代器的類別如下:

容器支援的迭代器類別

vector

隨機訪問

deque

隨機訪問

list雙向

set雙向

multiset雙向

map雙向

multimap雙向

stack

不支援

queue

不支援

priority_queue

不支援

stl不僅定義了迭代器及其五種類別,也定義了數個迭代器介面卡。

std::reverse_iterator 是類介面卡,用於適配雙向 或 隨機訪問迭代器。

stl定義了迭代器例項介面卡: std::back_insert_iterator、 std::front_insert_iterator 及std::insert_iterator 對外提供輸出介面卡。

另外一種例項介面卡是流迭代器,流迭代器以輸入、輸出迭代器的形式提供了對輸入、輸出流和流緩衝區的適配:

std::istream_iterator 、 std::ostream_iterator 、 std::istreambuf_iterator 及 std::ostreambuf_iterator.

stl演算法是一系列應用於迭代器區間的通用函式模板,演算法操作該區間或區間內的元素。

比如std::distance()演算法計算區間內元素的個數,並對傳給它的迭代器做解引用操作。

std::transform()演算法將乙個範圍內的元素經過變換後存到另乙個給定的容器中。

或稱仿函式,是一種可呼叫的物件,它可以是真正的函式,或者是乙個定義了函式呼叫運算子的類的例項。

函式物件主要搭配演算法使用,可能作為謂詞出現,也可能作為函式出現。

分配器對記憶體管理服務的型別應該滿足的要求做了描述,分配器最主要的功能,是對容器(及其他需要操作記憶體的元件)的記憶體操作細節進行抽象,提供統一的良好定義的介面,使其按照不同的記憶體服務要求,用不同的分配器特化。

一些知識點

字串拼接 1.a join b a為元素之間的分隔符,b為待分割的序列 可用於輸出時的資料處理,元素間有空格,末尾沒有 2 s s s str1,str2,str3 前半部分為字串,後半部分為索引。用於引入,s是物件 3.format str1,str2,str3 與f 括號裡為已有變數 關於for...

一些知識點

1.vector是在堆上還是棧上?在堆上.2.我們發現指標有一些 似是而非 的特徵 1 指標消亡了,並不表示它所指的記憶體會被自動釋放。比如函式中的指標是區域性變數,如果它指向了堆上,而自己出了函式後消亡了,但它所指向的記憶體還是存在的,導致了記憶體洩漏.2 記憶體被釋放了,並不表示指標會消亡或者成...

一些知識點

1 sln 解決方案檔案 csproj 專案檔案 cs 原始檔 解決方案包含多個專案,每個專案都是乙個程式。config 配置檔案 3 const int a 1 const 定義乙個量為常量,運算中用到當常量使用,不可以再重新賦值。4 型別轉換。1 隱式轉換。從值型別轉換成引用型別。從引用型別轉換...