1. 程式人生 > >STL中各個容器的實現基本原理以及互相依賴

STL中各個容器的實現基本原理以及互相依賴

STL中一共擁有六大元件:

1.演算法 2.迭代器 3.容器. 4.仿函式 5.介面卡(配接器)6.空間配置器

通過閱讀侯捷版本的《STL原始碼剖析》可以知道,STL的實現也是由基本的資料結構來完成的

容器大概可以分為關聯型容器和序列型容器,

序列型容器有vector,list,deque,queue,stack,slist,heap,priority_queue

vector由陣列實現,當現有陣列容量不足時,申請新的記憶體,每次新增一倍當前容量的記憶體。

deque翻譯為雙端佇列,但它由一箇中央控制器(map——此map非彼map)負責實現,deque的資料儲存在零零散散的多個固定長度的陣列中,而map中儲存著一個指標,指標分別指向這些陣列,deque先從map的中間位置(因為是雙端佇列,故各個指標是由中間向兩端依次排開)獲取指標,然後移動到具體的陣列中存放資料。當陣列不夠用時,申請新的陣列並在map中記載指標,當map也不夠時,申請新的map,並且將原有的Map拷貝至新申請的map中來。因此map的複雜度大於vector。

stack、queue基於deque;

heap:完全二叉樹,使用大頂堆實現,然後進行排序,以vector的形式存放

priority_queue:基於heap

list:雙向環形連結串列

slist::單鏈表

關聯式容器:
set,map,multiset,multimap-基於紅黑樹(RB-tree),一種加上了額外平衡條件的二叉搜尋樹。
hash table-散列表。將待存資料的key經過對映函式變成一個數組(一般是vector)的索引,例如:資料的key%陣列的大小=陣列的索引(一般文字通過演算法也可以轉換為數字),然後將資料當作此索引的陣列元素。有些資料的key經過演算法的轉換可能是同一個陣列的索引值(碰撞問題,可以用線性探測,二次探測來解決),STL是用開鏈的方法來解決的,每一個數組的元素維護一個list,他把相同索引值的資料存入一個list,這樣當list比較短時執行刪除,插入,搜尋等演算法比較快。


hash_map,hash_set,hash_multiset,hash_multimap-基於hash table。

相關推薦

STL各個容器實現基本原理以及互相依賴

STL中一共擁有六大元件: 1.演算法 2.迭代器 3.容器. 4.仿函式 5.介面卡(配接器)6.空間配置器 通過閱讀侯捷版本的《STL原始碼剖析》可以知道,STL的實現也是由基本的資料結構來完成的 容器大概可以分為關聯型容器和序列型容器, 序列型容器有vector,

STL map 容器基本用法

map 陣列寫法 #include <map> #include <string> #include <iostream> Using namespace std; Int main() {   

最近鄰插值和雙線性插值的基本原理 以及OpenCVresize函式的用法改變影象的大小

最近鄰插值和雙線性插值的基本原理 影象的縮放很好理解,就是影象的放大和縮小。傳統的繪畫工具中,有一種叫做“放大尺”的繪畫工具,畫家常用它來放大圖畫。當然,在計算機上,我們不再需要用放大尺去放大或縮小影象了,把這個工作交給程式來完成就可以了。下面就來講講計算機怎麼來放大縮小圖象;在本文中,

C++進階STL 02 實現基本原理

// demo1_hello_world.cpp: 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include<iostream> #include<vector> #include<algorithm>

c#實現簡單的注入容器,認識注入容器基本原理

在學習了反射和注入的概念後,加上專案中也用到 比如 AutoFuc 還有 unity 等容器。就有點想寫自己的容器的想法。 然後 搜尋了下 注入容器相關的文章,大多是多某個成熟的注入容器的程式碼進行解析,或者是對 注入概念的解析。成熟的框架考慮到方方面面,原始碼對於新手來說

Python集合(set)的基本操作以及一些常見的用法

python set 集合 集合的一些常見用法 Python除了List、Tuple、Dict等常用數據類型外,還有一種數據類型叫做集合(set),集合的最大特點是:集合裏邊的元素是不可重復的並且集合內的元素還是無序的,所以一般情況下集合常用的兩個場景是:1.去重(如:列表去重);2.關

ENSP環境不同vlan實現DHCP功能以及DHCP中繼的配置

在三層交換機上行配置DHCP的中繼一、網絡拓撲圖二、思路:將交換機作為三層交換機配置,vlan2,3的網關放在交換機上,路由器配置DHCP服務器vlan 2,3的網關上配置DHCP中繼。可以實現不同VLAN通過DHCP獲取不同網段的IP三、配置交換機,命令如下:<Huawei>system-vie

T-SQL查詢進階--理解SQL Server索引的概念,原理以及其他

工具 def microsoft 需要 blog b- eve 實現 中一 簡介 在SQL Server中,索引是一種增強式的存在,這意味著,即使沒有索引,SQL Server仍然可以實現應有的功能。但索引可以在大多數情況下大大提升查詢性能,在OLAP

STL容器

初始化 multiset c++ vector容器 給人 開發 amp sort函數 訪問 一、什麽是STL STL是standart template library,標準模板庫 是HP實驗室開發的一系列軟件的統稱,從根本上說,它是一些容器和算法的集合,它是世界上很多最聰

PCB 加投率計算實現基本原理--K最近鄰算法(KNN)

最近鄰 plist 控制 str 驗收 階段 分享圖片 數據量 出現 PCB行業中,客戶訂購5000pcs,在投料時不會直接投5000pcs,因為實際在生產過程不可避免的造成PCB報廢, 所以在生產前需計劃多投一定比例的板板, 例:訂單 量是5000pcs,加投3%,那就

統計機器學習標註圖片各個類別的樣本樣以及檢查特殊樣本數量

       在進行機器學習或深度學習中,對於那種邊訓練邊增加圖片樣的情況,我們要經常需要獲知目前資料量中樣本的分佈以及處理特殊情況(比如標註框面積小於指定閾值的標註等),為此寫了個簡單程式方面後面使用,特記錄於此.由於程式簡明扼要有些

C++|STL學習筆記-對STL關聯容器map的進一步認識

關聯容器map key + value 的值 關聯容器 = 有序容器(紅黑樹) + 無序容器(散列表) + hash_map 有序容器中: map的鍵值是不允許重複的 multimap的鍵值是允許重複的 set是一個集合,鍵值=實值,就是隻包含一個值,既是鍵值也是實值,不允許重複 mul

python協程實現的本質以及兩個封裝協程模組greenle、gevent

協程 協程,又稱微執行緒,纖程。英文名Coroutine。 協程是啥 協程是python箇中另外一種實現多工的方式,只不過比執行緒更小佔用更小執行單元(理解為需要的資源)。 為啥說它是一個執行單元,因為它自帶CPU上下文。這樣只要在合適的時機, 我們可以把一個協程 切換到另一個協程。 只要這個過程中儲存

C++STLvector容器 begin()與end()函式、front()與back()

begin函式: 函式原型: iterator begin(); const_iterator begin(); 功能: 返回一個當前vector容器中起始元素的迭代器。 end函式: 函式原型: iterator end(); const_iterat

(轉)C++ STLmap.erase(it++)用法原理解析

之前在程式碼中使用map::erase函式時,誤搬了vector::erase的用法,導致Server down掉了,好在在測試環境就及時發現了問題,在上線前進行了補救==。  以下總結一下map::erase的正確用法。  首先看一下在迴圈中使用vector::eras

c++STL的next_permutation函式基本用法

對於next_permutation函式是針對於排列組合問題的庫函式,它的排序方式是按照字典的方式排列的·: 如以下程式碼對於next_permutation函式的初步解釋: #include<cstdio> #include<cstring> #

JavaScript面向物件的小球碰撞實現基本原理

主要記錄一下重點和難點 <!doctype html> <html> <head> <meta charset="utf-8"> <title>碰撞反彈</title> <style> *

AndroidRxJava使用1----基本原理

簡單說就是:一個被觀察者,一個(或多個)觀察者,被觀察者給觀察者發訊息。 具體就是: 1)Observable:被觀察者(主題Subject) 2)Observer/Subscriber :觀察者 3)Subscribe:訂閱(就是被觀察者給觀察者發訊息) Ob

STL常用容器的選擇

今天去面試問到了stl的常用容器演算法問題,但是提前沒準備,平時也沒太在意,還有就是忘了。總之,回答得很狼狽。 希望能在這裡整理一下,首先看了一下《STL原始碼剖析》中對STL六大元件是這樣介紹的: 容器(containers):各種資料結構,用來存放資料。從實現的角度看,