C++ STL庫的總結以及實現原理
基本上常用的STL在演算法題目中都能用到,配合iterator和排序,比較等演算法,有時可以自己組合stl成為具有新功能的資料結構,以解決特定的問題。
下面轉載的這邊文章還不夠全。更多的使用情況,需要多練習題目,自己總結,孰能生巧。
-----
STL的容器可以分為以下幾個大類:
一:序列容器, 有vector, list, deque, string.
二 : 關聯容器, 有set, multiset, map, mulmap
hash_set,hash_map, hash_multiset, hash_multimap
三: 其他的雜項: stack, queue, valarray, bitset
STL各個容器的實現:
(1) vector
內部資料結構:陣列。隨機訪問每個元素,所需要的時間為常量。在末尾增加或刪除元素所需時間與元素數目無關,在中間或開頭增加或刪除元素所需時間隨元素數目呈線性變化。可動態增加或減少元素,記憶體管理自動完成,但程式設計師可以使用reserve()成員函式來管理記憶體。
vector的迭代器在記憶體重新分配時將失效(它所指向的元素在該操作的前後不再相同)。當把超過capacity()-size()個元素插入 vector中時,記憶體會重新分配,所有的迭代器都將失效;否則,指向當前元素以後的任何元素的迭代器都將失效。當刪除元素時,指向被刪除元素以後的任何
(2)deque
內部資料結構:陣列。隨機訪問每個元素,所需要的時間為常量。在開頭和末尾增加元素所需時間與元素數目無關,在中間增加或刪除元素所需時間隨元素數目呈線性變化。可動態增加或減少元素,記憶體管理自動完成,不提供用於記憶體管理的成員函式。增加任何元素都將使deque的迭代器失效。在deque的中間刪除元素將使迭代器失效。在deque的頭或尾刪除元素時,只有指向該元素的迭代器失效。
(3)list
內部資料結構:雙向環狀連結串列。不能隨機訪問一個元素。可雙向遍歷。在開頭、末尾和中間任何地方增加或刪除元素所需時間都為常量。可動態增加或減少元素,記憶體管理自動完成。
(4)slist
內部資料結構:單向連結串列。不可雙向遍歷,只能從前到後地遍歷。其它的特性同list相似。
(5)stack
介面卡,它可以將任意型別的序列容器轉換為一個堆疊,一般使用deque作為支援的序列容器。元素只能後進先出(LIFO)。不能遍歷整個stack。
(6)queue
介面卡,它可以將任意型別的序列容器轉換為一個佇列,一般使用deque作為支援的序列容器。元素只能先進先出(FIFO)。不能遍歷整個queue。
(7)priority_queue
介面卡,它可以將任意型別的序列容器轉換為一個優先順序佇列,一般使用vector作為底層儲存方式。只能訪問第一個元素,不能遍歷整個priority_queue。第一個元素始終是優先順序最高的一個元素。
(8)set
按照鍵進行排序儲存,值必須可以進行比較,可以理解為set就是鍵和值相等的map
鍵唯一。元素預設按升序排列。如果迭代器所指向的元素被刪除,則該迭代器失效。其它任何增加、刪除元素的操作都不會使迭代器失效。
(9)multiset
鍵可以不唯一。其它特點與set相同。
(10)hash_set
與set相比較,它裡面的元素不一定是經過排序的,而是按照所用的hash函式分派的,它能提供更快的搜尋速度(當然跟hash函式有關)。hash_set將key進行hash,然後將key放在hash值對應的桶中,原理可以這樣理解, hash_set就是key, value相等的hash_map
其它特點與set相同。
(11)hash_multiset
鍵可以不唯一。其它特點與hash_set相同。
(12)map
鍵唯一。元素預設按鍵的升序排列。如果迭代器所指向的元素被刪除,則該迭代器失效。其它任何增加、刪除元素的操作都不會使迭代器失效。
(13)multimap
鍵可以不唯一。其它特點與map相同。
(14)hash_map
與map相比較,它裡面的元素不一定是按鍵值排序的,而是按照所用的hash函式分派的,它能提供更快的搜尋速度(當然也跟hash函式有關)。其它特點與map相同。
(15)hash_multimap
鍵可以不唯一。其它特點與hash_map相同。
------------------------
C++ STL中標準關聯容器set, multiset, map, multimap內部採用的就是一種非常高效的平衡檢索二叉樹:紅黑樹,也成為RB樹(Red-Black Tree)。RB樹的統計效能要好於一般平衡二叉樹,所以被STL選擇作為了關聯容器的內部結構。
相關推薦
C++ STL庫的總結以及實現原理
基本上常用的STL在演算法題目中都能用到,配合iterator和排序,比較等演算法,有時可以自己組合stl成為具有新功能的資料結構,以解決特定的問題。 下面轉載的這邊文章還不夠全。更多的使用情況,需要多練習題目,自己總結,孰能生巧。 ----- STL的容器可以分
[C++] STL庫函式之字串string::npos的介紹,以及string中的find函式~
npos經常和find一起用~它們兩個都在標頭檔案<string>裡面~先看用法: #include <iostream> #include <string> us
Objective-C之Autorelease Pool底層實現原理記錄(雙向連結串列)以及在Runloop中是如何參與進去的
最近需要重新整理知識點備用,把一些重要的原理都搞了一遍 前言 int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, a
數據庫索引的實現原理
sys 存在 最大 還需 是否 div 一鍵 知識庫 組合 說白了,索引問題就是一個查找問題。。。 數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現通常使用B樹及其變種B+樹。 在數據之外,數據庫系統還維護著滿足特定查找算
C++STL庫常騰訊分用分彩平臺出租數據結構用法整理
隊列 splice 插入元素 key alloc ase 輸出 整理 eve vector騰訊分用分彩平臺出租 haozbbs.com Q1446595067創建對象,vector<int> vec;尾部插入數字,vec.push_back(a);使用下表訪
漫談 C++ 的 內存堆 實現原理
當前 就是 問題 spa 設計 所在 內存 vision 分配 如果我來設計 C++ 的 內存堆 , 我會這樣設計 : 進程 首先會跟 操作系統 要 一塊大內存區域 , 我稱之為 Division , 簡稱 div 。 然後
C++ stl庫bind函數模板用法的註意事項
並不是 cti ios 用法 upd out 版本 包裝 函數模板 類成員函數 bind可以包裝類成員函數,創建函數對象。其中有接收類類型和類指針類型的版本,如: #include <iostream> #include <memory> #incl
資料結構之C++STL庫
使用STL實現迭代器 #include<iostream> #include<vector> using namespace std; void print(vector<int> v) { //從向量開頭順次訪問 vector<int
字尾樹系列一:概念以及實現原理( the Ukkonen algorithm)
首先說明一下字尾樹系列一共會有三篇文章,本文先介紹基本概念以及如何線性時間內構件字尾樹,第二篇文章會詳細介紹怎麼實現字尾樹(包含實現程式碼),第三篇會著重談一談字尾樹的應用。 本文分為三個部分, 首先介紹一下字尾樹的“前身”– trie樹以及字
HashMap詳談以及實現原理
原文連結:https://www.cnblogs.com/KongkOngL/p/6833518.html https://www.cnblogs.com/xwdreame
c++ STL之vector的實現
概述 vector作為STL中最常用的容器之一,他基於陣列實現,是一個動態陣列,其容量能自動增長,同時也提供了許多操作方法,十分高效實用。那麼我們來嘗試寫一個自己的vector吧!(當然,自己寫的肯定沒有STL中的高效,就當是一次學習探索吧) 開工! 如何實現動
關於 C#呼叫一個C/C++dll庫執行時實現多個應用(靜態變數區分) 的解決方法
需求 VS編寫了純C(windows)通訊庫,需要多例項(靜態變數標誌一個例項,達到互相靜態變數不干涉)。 當前問題 dll中使用了全域性static的標
C++ STL庫—— 基礎泛型演算法copy
copy 函式原型: template<class _InIt, class _OutIt> inline _OutIt copy(_InIt _First, _InIt _Last, _OutIt _Dest) { // copy [_Firs
C++ STL庫 泛型演算法 find 和 find_if
一:find()函式 函式原型: template<class _InIt, class _Ty> _NODISCARD inline _InIt find(_InIt _First, const _InIt _Last, const _Ty& _
vs C++ 靜態庫 生成以及使用的兩種方法
C++靜態庫的生成 1、 vs專案配置:選擇 靜態庫 2、 新建標頭檔案 add.h 3、 新建標頭檔案 add.cpp 4、 執行“生成解決方案”,工程DEBUG目錄如下: C++靜態庫的使用 方法一 1、 新建 win32控制檯應用程式 2、 專案屬性-->c/c
c++ STL vector 的簡易實現
template <class T> class myVector { public: myVector():p(NULL),capacity(0),size(0)//預設建構函式 { } myVector(int size)//預
Docker核心技術以及實現原理
Docker的出現,為後端開發和運維提供了虛擬化技術,優雅地解決了開發環境和生產環境不一致的問題。本文總結了下Docker使用的核心技術和工作機理,為了往後能夠學習地更透徹。 Namespaces 名稱空間可以有效地幫助Docker分離程序樹
C++底層資料結構的實現原理
1.vector 底層資料結構為陣列 ,支援快速隨機訪問 2.list 底層資料結構為雙向連結串列,支援快速增刪 3.deque 底層資料結構為一箇中央控制器和多個緩衝區,詳細見STL原始碼剖析P146,支援首
slf4j介紹以及實現原理窺探
一、概述 slf4j(全稱是Simple Loging Facade For Java)是一個為Java程式提供日誌輸出的統一介面,並不是一個具體的日誌實現方案,就好像我們經常使用的JDBC一樣,只是一種規則而已。因此單獨的slf4j是不能工作的,它必須搭配其他具體的日誌實現方案,比如apache的or
android 狀態列狀態總結以及實現
情況分析: 1.全屏、不保留狀態列文字(Splash頁面,歡迎頁面) 2.全屏保留狀態列文字(頁面上部有Banner圖) 3.標題欄與狀態列顏色一致(部分App風格) 4.不同Fragment中對StatusBar的處理不一樣 5.設定狀態列文字的顏色 6.切